perm filename ALPHA.LST[ALF,DEK] blob
sn#554085 filedate 1980-07-22 generic text, type T, neo UTF8
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 1
1 COMMENT ⊗ VALID 00021 PAGES
2 C REC PAGE DESCRIPTION
3 C00001 00001
4 C00004 00002 →→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→ ALPHATEX ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
5 C00008 00003 Interrupt jump table (when on-line)
6 C00012 00004 Floppy disk operations:
7 C00017 00005 Other operations available before going on-line:
8 C00027 00006 Primitive debugging routines that might be helpful in emergencies:
9 C00035 00007 Beginning of instructions for on-line processing (non-overlaid area):
10 C00038 00008 Main scanning routine, returns the next byte of input in register A:
11 C00041 00009 A program that prepares to typeset a character.
12 C00044 00010 The main scanning loop, beginning a new instruction:
13 C00049 00011 Program to set a specified beam brightness.
14 C00052 00012 Programs for simple adjustment commands.
15 C00054 00013 Interrupt handling for data received from computer or operator.
16 C00060 00014 Lens motor control routines:
17 C00070 00015 Feed motor control routines:
18 C00080 00016 Programs for beginning and ending the typesetting of a line or page.
19 C00089 00017 Processing of scan-done interrupts:
20 C00101 00018 Handy general-purpose subroutines:
21 C00105 00019 Constants and special tables.
22 C00110 00020 Program variables:
23 C00120 00021 The second memory board (locations 8000H and higher):
24 C00132 ENDMK
25 C⊗;
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 2
26 ;→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→ ALPHATEX ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
27
28 ; Symbolic names of I/O ports:
29 00C8 LTIMR EQU 0C8H; lens motor timer.
30 00CA GTIMR EQU 0CAH; general-purpose timer.
31 00D0 FTIMR EQU 0D0H; feed motor timer.
32 00C0 INT EQU 0C0H; interrupt controller.
33 00DD DISPL EQU 0DDH; console display, keyboard input, motor switch sensors.
34 00DA BTLCH EQU 0DAH; "boot latch".
35 00DB MSLCH EQU 0DBH; "machine status latch".
36 0088 BRT1 EQU 088H; brightness control 1.
37 00A0 BRT2 EQU 0A0H; brightness control 2.
38 0098 BEAMR EQU 098H; beam position reset.
39 00DF BSTEP EQU 0DFH; beam step.
40 00D2 DMA EQU 0D2H; direct memory access, RAM to collector board.
41 00DE COLL EQU 0DEH; start collection.
42 00DF RPLCH EQU 0DFH; hardware cog counter and repeat latch.
43 0080 RS232 EQU 080H; on-line data interface.
44 00B8 RATE EQU 0B8H; repeat counter for baud rate setting.
45
46 ; The following addresses refer to subroutines in the boot PROM:
47 024F BTAD EQU 024FH; binary to ascii decimal.
48 014C CAC EQU 014CH; convert an ascii character.
49 0152 CDTAC EQU 0152H; convert decimal to ascii.
50 0223 DC EQU 0223H; display a character.
51 0215 DCS EQU 0215H; display a character string.
52 01B9 EIS EQU 01B9H; end interrupt service.
53 010D ERROR EQU 010DH; fatal error.
54 0173 KBIS EQU 0173H; keyboard interrupt service.
55 0110 NFE EQU 0110H; non-fatal error.
56 01FE SMD EQU 01FEH; single message display.
57
58 ; Note: The ORG instruction preceding "ABRT:" on page 7 needs to be adjusted
59 ; if code is added to the non-overlaid parts of this program.
60 ; Furthermore, please excuse a trick that saves two (2) bytes:
61 ; The least significant byte of location "TABLE" should not be 0 or 1.
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 3
62 ; Interrupt jump table (when on-line)
63 4000 ORG 4000H
64 4000 CD0D01 CALL ERROR; interrupt 0,
65 4003 00 NOP ; not used.
66 4004 FB EI ; interrupt 1,
67 4005 C35177 JMP LMIS; lens motor.
68 4008 FB EI ; interrupt 2,
69 4009 C38A7B JMP SDIS; scan done.
70 400C FB EI ; interrupt 3,
71 400D C36E78 JMP FMIS; feed motor.
72 4010 FB EI ; interrupt 4,
73 4011 C3C479 JMP GPTIS; general purpose timer.
74 4014 FB EI ; interrupt 5,
75 4015 C33477 JMP KBIS1; keyboard.
76 4018 FB EI ; interrupt 6,
77 4019 C37976 JMP RDIS; on-line data.
78 401C CD0D01 CALL ERROR; interrupt 7,
79 401F 00 NOP ; not used.
80 4020 REP1: ; First repertoire area, overlays the following.
81 4020 START: ; (Bootstrap jumps here after loading this program.)
82 4020 3E16 MVI A,16H; Move interrupt jump table to 6000H.
83 4022 D3C0 OUT INT
84 4024 3E60 MVI A,60H
85 4026 D3C1 OUT INT+1
86 4028 3EDF MVI A,11011111B; (Keyboard is the 0 in bit 5.)
87 402A D3C1 OUT INT+1; Enable keyboard interrupt (only).
88
89 402C 110343 PRMPT: LXI D,DM2; Display 'ALPHATEX ... COMMAND?'.
90 402F CD1502 CALL DCS
91 4032 97 WAIT: SUB A; Reset keyboard buffer.
92 4033 21C47F LXI H,KBLC
93 4036 77 MOV M,A
94 4037 B6 WAIT1: ORA M
95 4038 CA3740 JZ WAIT1; Wait until command code is typed.
96
97 403B 3ACB7F SWICH: LDA KBIB
98 403E 87 ADD A; A = (Key)*(switch table record length).
99 403F 1600 MVI D,0
100 4041 5F MOV E,A; DE = 00XX.
101 4042 214B40 LXI H,SWT; Compute switch table address.
102 4045 19 DAD D
103 4046 5E MOV E,M; Fetch branch address from table.
104 4047 23 INX H
105 4048 56 MOV D,M
106 4049 EB XCHG ; Put branch address in HL.
107 404A E9 PCHL ; Branch to routine.
108
109 404B 2C40 SWT: DW PRMPT; 0, no op.
110 404D 2C40 DW PRMPT; 1, no op.
111 404F 2C40 DW PRMPT; 2, no op.
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 3-2
112 4051 2C40 DW PRMPT; 3, no op.
113 4053 2C40 DW PRMPT; 4, no op.
114 4055 2C40 DW PRMPT; 5, no op.
115 4057 A942 DW ONLIN; 6, go on line.
116 4059 2C40 DW PRMPT; 7, no op.
117 405B 2C40 DW PRMPT; 8, copy font (not yet implemented).
118 405D 9640 DW INITD; 9, initialize diskette.
119 405F 5541 DW SERCH; A, address search.
120 4061 C940 DW DUMP; B, backup dump of program.
121 4063 EF41 DW MODFY; C, change and contemplate memory contents.
122 4065 6344 DW UNTR; D, dump trace information to host computer.
123 4067 0441 DW LOAD; E, enter HEX file from host computer.
124 4069 7242 DW FLASH; F, light show.
125
126 406B DBC0 QUIT: IN INT
127 406D 322060 STA INTSV; Store interrupt status for inspection.
128 4070 3A1D7F LDA BTLS
129 4073 E6F7 ANI 11110111B
130 4075 D3DA OUT BTLCH; Disable output GO.
131 4077 3E40 MVI A,40H
132 4079 D3CB OUT LTIMR+3
133 407B DBC9 IN LTIMR+1
134 407D 6F MOV L,A
135 407E DBC9 IN LTIMR+1
136 4080 67 MOV H,A
137 4081 222460 SHLD INTCL; Store clock reading.
138 4084 3E34 MVI A,34H
139 4086 D3CB OUT LTIMR+3
140 4088 3E70 MVI A,70H
141 408A D3CB OUT LTIMR+3; Attempt to stop lens motor.
142 408C 210000 LXI H,0
143 408F 39 DAD SP
144 4090 222260 SHLD INTSP; Store the stack height.
145 4093 C32040 JMP START
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 4
146 ; Floppy disk operations:
147 4096 112943 INITD: LXI D,DM3; Display 'INITIALIZING...'.
148 4099 CDFE01 CALL SMD
149
150 409C 21D843 LXI H,NEWDSK; Initialize first track.
151 409F CDE740 CALL DSKCOM
152 40A2 C2C040 JNZ INIT3; Jump if error.
153
154 40A5 3E1A INIT1: MVI A,26; Next track.
155 40A7 32FF7F STA NSCT; 26 sectors,
156 40AA 3E01 MVI A,1
157 40AC 32FC7F STA SECTR; beginning with sector 1.
158 40AF CDF540 CALL DSKGO
159 40B2 C2C040 JNZ INIT3
160
161 40B5 3AFB7F LDA TRACK
162 40B8 FE4D CPI 77
163 40BA C2A540 JNZ INIT1; Repeat until track 77 reached.
164 40BD C32C40 JMP PRMPT; Return to control routine.
165
166 40C0 INIT3:
167 40C0 113943 DUMP3: LXI D,DM4; 'CANNOT WRITE ON DISK 1'.
168 40C3 CD1001 DUMP4: CALL NFE
169 40C6 C32C40 JMP PRMPT
170
171 40C9 115043 DUMP: LXI D,DM5; Display 'BACKUP COPY BEING DUMPED...'.
172 40CC CDFE01 CALL SMD
173
174 40CF 21E043 LXI H,WRT32K; Write 32K starting at 4000H.
175 40D2 CDE740 CALL DSKCOM
176 40D5 C2C040 JNZ DUMP3
177
178 40D8 21E843 LXI H,CHK32K; Check 32K starting at 4000H.
179 40DB CDE740 CALL DSKCOM
180 40DE CA2C40 JZ PRMPT; Return to control routine.
181
182 40E1 116C43 LXI D,DM6; 'COULDN'T READ WHAT WAS DUMPED'.
183 40E4 C3C340 JMP DUMP4
184
185 ; Subroutine DSKCOM does disk I/O; arguments are in block pointed to by HL.
186
187 40E7 7E DSKCOM: MOV A,M; Select sector format.
188 40E8 32EE7F STA VARSE
189 40EB 23 INX H
190 40EC 010600 LXI B,6; Move 6 bytes to COMWD.
191 40EF 11F97F LXI D,COMWD
192 40F2 CDDC7D CALL MOVE
193
194 40F5 3E08 DSKGO: MVI A,8; Start disk command.
195 40F7 32F87F STA OKWD
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 4-2
196
197 40FA 3AF87F DSKWT: LDA OKWD; Wait for OKWD to change (disk command finished).
198 40FD FE08 CPI 8
199 40FF CAFA40 JZ DSKWT
200 4102 B7 ORA A; Report success or failure.
201 4103 C9 RET
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 5
202 ; Other operations available before going on-line:
203 4104 3A00BF LOAD: LDA LOADR
204 4107 FECD CPI 0CDH; Check if load routine seems intact.
205 4109 C22C40 JNZ PRMPT; If not, this routine is disabled.
206 410C 11AE43 LXI D,DM10; Display 'READY TO LOAD A HEX FILE:'.
207 410F CDFE01 CALL SMD
208
209 4112 3EFF MVI A,11111111B
210 4114 D3C1 OUT INT+1; All interrupts are disabled.
211
212 4116 3E0F MVI A,00001111B
213 4118 D3B8 OUT RATE
214 411A 3E03 MVI A,00000011B; Force USART chip into command state.
215 411C D381 OUT RS232+1
216 411E 3E61 MVI A,01100001B; Reset USART chip.
217 4120 D381 OUT RS232+1
218 4122 3E4E MVI A,01001110B; Set baud rate 9600.
219 4124 D381 OUT RS232+1
220 4126 3E37 MVI A,00110111B; Enable USART for sending and receiving.
221 4128 D381 OUT RS232+1;
222 412A C300BF JMP LOADR
223
224 412D 7D CHB: MOV A,L; Subroutine to convert hex codes to one byte:
225 412E 07 RLC ; (If HL = 0X 0Y hex, then A = YX hex.)
226 412F 07 RLC
227 4130 07 RLC
228 4131 07 RLC
229 4132 B4 ORA H
230 4133 C9 RET
231
232 4134 97 RDKC: SUB A; Subroutine to read and display B keyboard codes:
233 4135 32C47F STA KBLC; Clear keyboard buffer.
234
235 4138 21C47F RDKC1: LXI H,KBLC; Look at input buffer count.
236 413B 7E MOV A,M
237 413C BE RDKC2: CMP M
238 413D CA3C41 JZ RDKC2; Wait until code entered (KBLC changes).
239
240 4140 5F MOV E,A
241 4141 1600 MVI D,0; DE=count.
242 4143 21CB7F LXI H,KBIB
243 4146 19 DAD D
244 4147 7E MOV A,M; Get keyboard code.
245 4148 C5 PUSH B
246 4149 CD5201 CALL CDTAC; Convert hexadecimal to ascii.
247 414C CD2302 CALL DC; Display the character.
248 414F C1 POP B
249 4150 05 DCR B
250 4151 C23841 JNZ RDKC1; Repeat.
251 4154 C9 RET
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 5-2
252
253
254 4155 2AFEBF SERCH: LHLD 0BFFEH
255 4158 E5 PUSH H; Save top two bytes of memory.
256
257 4159 118A43 LXI D,DM7; Display 'ADDRESS '.
258 415C CDFE01 CALL SMD
259 415F 0604 MVI B,4
260 4161 CD3441 CALL RDKC; Read and display four keyboard codes.
261
262 4164 2ACB7F LHLD KBIB; Convert them to binary.
263 4167 CD2D41 CALL CHB
264 416A 57 MOV D,A
265 416B 32FFBF STA 0BFFFH; Store at top end of memory.
266 416E 2ACD7F LHLD KBIB+2
267 4171 CD2D41 CALL CHB
268 4174 5F MOV E,A
269 4175 32FEBF STA 0BFFEH
270
271 4178 210040 LXI H,4000H; Begin search at 4000H.
272 417B 7E SRCH1: MOV A,M
273 417C BB SRCH2: CMP E
274 417D 23 INX H
275 417E C27B41 JNZ SRCH1
276 4181 7E MOV A,M
277 4182 BA CMP D
278 4183 C27C41 JNZ SRCH2
279
280 4186 2B DCX H; We found one in location HL.
281 4187 7C MOV A,H
282 4188 FEBF CPI 0BFH
283 418A C29441 JNZ SRCH3
284 418D 7D MOV A,L
285 418E FEFE CPI 0FEH
286 4190 CAE441 JZ SRCH9; Exit if it was the top location (we knew about that).
287 4193 7C MOV A,H
288 4194 22ED41 SRCH3: SHLD SLOC
289 4197 EB XCHG
290 4198 22EB41 SHLD SLOOK
291
292 419B 21CA43 LXI H,DM11+2
293 419E 0F RRC
294 419F 0F RRC
295 41A0 0F RRC
296 41A1 0F RRC
297 41A2 CD4C01 CALL CAC; Convert left four bits to ascii, storing in DM11.
298 41A5 3AEE41 LDA SLOC+1
299 41A8 CD4C01 CALL CAC; Convert right four bits to ascii.
300 41AB 3AED41 LDA SLOC
301 41AE 47 MOV B,A
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 5-3
302 41AF 0F RRC
303 41B0 0F RRC
304 41B1 0F RRC
305 41B2 0F RRC
306 41B3 CD4C01 CALL CAC; And again, four+four bits to ascii.
307 41B6 78 MOV A,B
308 41B7 CD4C01 CALL CAC
309 41BA 11C843 LXI D,DM11
310 41BD CD1502 CALL DCS; Display where we found it.
311
312 41C0 97 SUB A
313 41C1 32C47F STA KBLC
314 41C4 21C47F LXI H,KBLC
315 41C7 BE SRCH4: CMP M
316 41C8 CAC741 JZ SRCH4; Wait until user tingles the keyboard.
317
318 41CB 3ACB7F LDA KBIB
319 41CE FE0A CPI 0AH
320 41D0 C2E441 JNZ SRCH9; Exit if not 'A'.
321
322 41D3 2AEB41 LHLD SLOOK
323 41D6 EB XCHG
324 41D7 210000 LXI H,0
325 41DA 22EB41 SHLD SLOOK
326 41DD 2AED41 LHLD SLOC
327 41E0 23 INX H
328 41E1 C37B41 JMP SRCH1; Otherwise continue the search.
329
330 41E4 E1 SRCH9: POP H
331 41E5 22FEBF SHLD 0BFFEH; Restore top two bytes.
332 41E8 C32C40 JMP PRMPT
333 41EB 0000 SLOOK: DW 0; What we're seeking.
334 41ED 0000 SLOC: DW 0; Where we found it.
335
336
337
338 41EF 118A43 MODFY: LXI D,DM7; Display 'ADDRESS '.
339 41F2 CDFE01 CALL SMD
340 41F5 0604 MVI B,4
341 41F7 CD3441 CALL RDKC; Read and display four keyboard codes.
342
343 41FA 2ACB7F LHLD KBIB; Convert them to binary.
344 41FD CD2D41 CALL CHB
345 4200 57 MOV D,A
346 4201 2ACD7F LHLD KBIB+2
347 4204 CD2D41 CALL CHB
348 4207 5F MOV E,A
349
350 4208 7A MM1: MOV A,D; Check if address is in range.
351 4209 FE40 CPI 40H
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 5-4
352 420B DA6C42 JC MM3
353 420E FEC0 CPI 0C0H
354 4210 D26C42 JNC MM3
355
356 4213 D5 PUSH D; Save address.
357 4214 EB XCHG
358 4215 46 MOV B,M; Current byte value to B.
359
360 4216 219543 LXI H,DM8+2; Convert "XX" to ASCII(A).
361 4219 78 MOV A,B
362 421A 0F RRC
363 421B 0F RRC
364 421C 0F RRC
365 421D 0F RRC
366 421E CD4C01 CALL CAC; Convert left four bits to ascii.
367 4221 78 MOV A,B
368 4222 CD4C01 CALL CAC; Convert right four bits to ascii.
369 4225 119343 LXI D,DM8
370 4228 CD1502 CALL DCS; Display ' xx->'.
371
372 422B 0602 MVI B,2
373 422D CD3441 CALL RDKC; Read and display two keyboard codes.
374 4230 3AC47F MM2: LDA KBLC; Read the next code.
375 4233 FE03 CPI 3
376 4235 DA3042 JC MM2
377
378 4238 D1 POP D; Get modify address back.
379
380 4239 3ACD7F LDA KBIB+2
381 423C FE0B CPI 0BH
382 423E CA0842 JZ MM1; Back to same byte, unmodified, if "B".
383 4241 FE0C CPI 0CH
384 4243 CAEF41 JZ MODFY; Call for new address, no change here, if "C".
385 4246 FE0D CPI 0DH
386 4248 CA6842 JZ DNWRD; Decrement to previous byte, no modification, if "D".
387 424B FE0E CPI 0EH
388 424D CA2C40 JZ PRMPT; Exit, no modification, if "E".
389 4250 FE0F CPI 0FH
390 4252 CA6442 JZ ONWRD; Forward to next byte, no modification, if "F".
391
392 4255 2ACB7F LHLD KBIB; Fetch codes typed for this byte.
393 4258 CD2D41 CALL CHB; Convert them to binary.
394 425B 12 STAX D; Store the new byte.
395
396 425C 3ACD7F LDA KBIB+2
397 425F FE0A CPI 0AH; Advance, modified, if "A".
398 4261 C22C40 JNZ PRMPT; Otherwise go home, modification accepted.
399 4264 13 ONWRD: INX D
400 4265 C30842 JMP MM1; Go on to next word.
401
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 5-5
402 4268 1B DNWRD: DCX D
403 4269 C30842 JMP MM1; Go down to previous word.
404
405 426C 119943 MM3: LXI D,DM9; 'ADDRESS OUT OF RANGE'.
406 426F C3C340 JMP DUMP4
407
408 4272 97 FLASH: SUB A
409 4273 32C47F STA KBLC; Clear keyboard buffer.
410 4276 06F7 MVI B,11110111B; B←one bit of light.
411 4278 68 MOV L,B; Ensure that HL ≠ 00.
412
413 4279 1111A0 FL1: LXI D,0A011H; DE←primitive polynomial.
414 427C 29 DAD H; Advance the shift register sequence (period is 65535).
415 427D 78 MOV A,B
416 427E D28A42 JNC FL2
417 4281 19 DAD D
418
419 4282 0F RRC
420 4283 DA9042 JC FL3
421 4286 0F RRC ; Seven-bit rotation, moves the bit down.
422 4287 C39042 JMP FL3
423
424 428A 07 FL2: RLC
425 428B B7 ORA A
426 428C FA9042 JM FL3
427 428F 07 RLC ; Seven-bit rotation, moves the bit up.
428
429 4290 47 FL3: MOV B,A
430 4291 E67F ANI 01111111B
431 4293 EE00 XRI 00000000B
432 4295 D3DD OUT DISPL; Display the new column.
433
434 4297 3AC47F LDA KBLC
435 429A B7 ORA A
436 429B C23B40 JNZ SWICH; Return to control after the next typein.
437
438 429E EB XCHG
439 429F 21C801 LXI H,200+256
440 42A2 CDF27D CALL DELAY; Delay about 10 milliseconds.
441 42A5 EB XCHG
442
443 42A6 C37942 JMP FL1; Repeat.
444
445 42A9 3E16 ONLIN: MVI A,16H
446 42AB D3C0 OUT INT
447 42AD 3E40 MVI A,40H
448 42AF D3C1 OUT INT+1; Move the interrupt jump table to 4000H.
449 42B1 3E81 MVI A,10000001B
450 42B3 D3C1 OUT INT+1; Enable all six interrupts.
451 42B5 3E0B MVI A,00001011B
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 5-6
452 42B7 D3C0 OUT INT; Prepare to read interrupt status register.
453
454 42B9 3E0F MVI A,00001111B
455 42BB D3B8 OUT RATE
456 42BD 3E03 MVI A,00000011B; Force USART chip into command state.
457 42BF D381 OUT RS232+1
458 42C1 3E61 MVI A,01100001B; Reset USART chip.
459 42C3 D381 OUT RS232+1
460 42C5 3E4E MVI A,01001110B; Set baud rate 9600.
461 42C7 D381 OUT RS232+1
462 42C9 3E37 MVI A,00110111B; Enable USART for sending and receiving.
463 42CB D381 OUT RS232+1;
464
465 42CD 3AD47E LDA MSLSI
466 42D0 D3DB OUT MSLCH
467 42D2 3AD57E LDA BTLSI
468 42D5 D3DA OUT BTLCH
469 42D7 31C27F LXI SP,ISPV; We want to start with a fresh stack.
470 42DA 11CE43 LXI D,DM14; Display `ON LINE: '.
471 42DD CDFE01 CALL SMD
472 42E0 210085 LXI H,8500H
473 42E3 22F043 SHLD TRACL; Initialize for tracing.
474 42E6 C3B573 JMP REST2; Start (or restart) the typesetting program.
475
476 ; Table of display messages that are overlaid:
42E9 1944554D
42ED 50494E47
42F1 20544845
42F5 20545241
42F9 43452049
42FD 4E464F2E
477 4301 2E2E DM1: DB 25,'DUMPING THE TRACE INFO...'
4303 25414C50
4307 48415445
430B 58205345
430F 52564552
4313 204A554C
4317 5920372C
431B 31393830
431F 2E20434F
4323 4D4D414E
478 4327 443F DM2: DB 37,'ALPHATEX SERVER JULY 7,1980. COMMAND?'
4329 0F494E49
432D 5449414C
4331 495A494E
479 4335 472E2E2E DM3: DB 15,'INITIALIZING...'
4339 1643414E
433D 4E4F5420
4341 57524954
4345 45204F4E
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 5-7
4349 20444953
480 434D 4B2031 DM4: DB 22,'CANNOT WRITE ON DISK 1'
4350 1B424143
4354 4B555020
4358 434F5059
435C 20424549
4360 4E472044
4364 554D5045
481 4368 442E2E2E DM5: DB 27,'BACKUP COPY BEING DUMPED...'
436C 1D434F55
4370 4C444E27
4374 54205245
4378 41442057
437C 48415420
4380 57415320
4384 44554D50
482 4388 4544 DM6: DB 29,'COULDN',27H,'T READ WHAT WAS DUMPED'
438A 08414444
438E 52455353
483 4392 20 DM7: DB 8,'ADDRESS '
4393 05205858
484 4397 2D3E DM8: DB 5,' XX->'
4399 14414444
439D 52455353
43A1 204F5554
43A5 204F4620
43A9 52414E47
485 43AD 45 DM9: DB 20,'ADDRESS OUT OF RANGE'
43AE 19524541
43B2 44592054
43B6 4F204C4F
43BA 41442041
43BE 20484558
43C2 2046494C
486 43C6 453A DM10: DB 25,'READY TO LOAD A HEX FILE:'
43C8 05205858
487 43CC 5858 DM11: DB 5,' XXXX'
43CE 094F4E20
43D2 4C494E45
488 43D6 3A20 DM14: DB 9,'ON LINE: '
489
490 ; VARSE COMWD DISK TRACK SECTR ADDR NSCT
43D8 00060100
491 43DC 0100001A NEWDSK: DB 0, 6, 1, 0, 1, 00,00, 26
43E0 00020100
492 43E4 01004000 WRT32K: DB 0, 2, 1, 0, 1, 00,40H, 0
43E8 00030100
493 43EC 01004000 CHK32K: DB 0, 3, 1, 0, 1, 00,40H, 0
494
495 43F0 DSKARG: PHASE 0; Defining disk command argument block.
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 5-8
496 43F0 00 SETVAR: DB 0
497 43F1 00 SETCOM: DB 0
498 43F2 00 SETDSK: DB 0
499 43F3 00 SETTRK: DB 0
500 43F4 00 SETSCT: DB 0
501 43F5 0000 SETADR: DW 00
502 0007 SETNSC: DEPHASE
503 43F0 ORG DSKARG
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 6
504 ; Primitive debugging routines that might be helpful in emergencies:
505
506 43F0 0085 TRACL: DW 8500H; Area where next tracing info will be dumped.
507 43F2 0085 UNTRL: DW 8500H; Location to begin output of tracing info.
508
509 ; If "CALL TRACE" is inserted into the non-overlaid program,
510 ; and if the "overlaid" sections of AlphaTEX are not in fact overlaid,
511 ; this subroutine will store 16 bytes of potentially relevant information, to wit:
512
513 ; xxx0 lsb of stack pointer
514 ; xxx1 the interrupt service register
515 ; xxx2 register C
516 ; xxx3 register B
517 ; xxx4 register E
518 ; xxx5 register D
519 ; xxx6 register L
520 ; xxx7 register H
521 ; xxx8 sign,zero,0,auxcarry,0,parity,1,carry bits
522 ; xxx9 register A
523 ; xxxA lsb of calling location
524 ; xxxB msb of calling location
525 ; xxxC top byte of stack
526 ; xxxD 2nd byte of stack
527 ; xxxE 3rd byte of stack
528 ; xxxF 4th byte of stack
529
530 ; Caution: It takes 897 cycles (448.5 microseconds) to CALL TRACE. This might
531 ; interfere with the program timing, especially when servicing interrupts.
532
533 43F4 F5 TRACE: PUSH PSW; First we fill the stack with stuff to dump.
534 43F5 E5 PUSH H
535 43F6 D5 TRAC2: PUSH D
536 43F7 C5 PUSH B
537
538 43F8 3EFF MVI A,11111111B
539 43FA D3C1 OUT INT+1; Disable all interrupts;
540
541 43FC 21FEFF LXI H,-2
542 43FF 39 DAD SP; H ← value of SP after the PUSH to follow.
543 4400 5D MOV E,L
544 4401 DBC0 IN INT
545 4403 57 MOV D,A
546 4404 D5 PUSH D; This pushes lsb of stack pointer and the ISR byte.
547 4405 EB XCHG ; DE←stack pointer.
548 4406 2AF043 LHLD TRACL
549 4409 0E10 MVI C,16
550
551 440B 1A TRAC1: LDAX D; Now we copy the top 16 bytes of the stack.
552 440C 77 MOV M,A
553 440D 13 INX D
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 6-2
554 440E 23 INX H
555 440F 0D DCR C
556 4410 C20B44 JNZ TRAC1
557
558 4413 22F043 SHLD TRACL
559 4416 3E81 MVI A,10000001B
560 4418 D3C1 OUT INT+1; Unmask the interrupts.
561 441A 7C MOV A,H
562 441B FEBC CPI 0BCH
563
564 441D D1 POP D; Restore registers.
565 441E C1 POP B
566 441F D1 POP D
567 4420 CA3244 JZ DEB3; Abort if the trace dump area is full.
568 4423 E1 TRAC3: POP H
569 4424 F1 POP PSW
570 4425 C9 RET
571
572 ; If "CALL DEBUG" is inserted into the non-overlaid program,
573 ; and if the "overlaid" sections of AlphaTEX are not in fact overlaid,
574 ; this subroutine will do a TRACE and also generate an ABORT command
575 ; that will take AlphaTEX off line again.
576
577 4426 3A1D7F DEB0: LDA BTLS; This entrance comes from a missed scan-done interrupt.
578 4429 E6F7 ANI 11110111B
579 442B 321D7F STA BTLS
580 442E D3DA OUT BTLCH; Disable output GO.
581
582 4430 F5 DEBUG: PUSH PSW; Store registers, in preparation for TRACE.
583 4431 E5 PUSH H
584
585 4432 3E0F DEB3: MVI A,00001111B
586 4434 32157F STA QFLAG; Abort prepared.
587 4437 2A5D44 LHLD DEB1
588 443A 22B573 SHLD REST2; CODE MODIFICATION!!!
589 443D 3A5F44 LDA DEB1+2
590 4440 32B773 STA REST2+2; Store a JMP DEB2 at RESET handler.
591
592 4443 3AF143 LDA TRACL+1; Look at msb of TRACL.
593 4446 FEBC CPI 0BCH
594 4448 C2F643 JNZ TRAC2; Trace, unless trace dump area is full.
595 444B C3A273 JMP ABRT1; Otherwise abort.
596
597 444E 2A6044 DEB2: LHLD REST0
598 4451 22B573 SHLD REST2; Restore location REST2 to normal contents.
599 4454 3A6244 LDA REST0+2
600 4457 32B773 STA REST2+2
601 445A C32040 JMP START; Restart off-line command processing.
602
603 445D C34E44 DEB1: JMP DEB2; Command stored temporarily in location REST2.
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 6-3
604 4460 011700 REST0: LXI B,INITE-INITB; Normal contents of location REST2.
605
606 ; The following routine sends the traced data back to a host computer file
607 ; so that it can be studied at leisure.
608 4463 11E942 UNTR: LXI D,DM1; Display 'DUMPING TRACE INFO...'.
609 4466 CDFE01 CALL SMD
610 4469 97 SUB A
611 446A 32C47F STA KBLC
612 446D 2AF043 LHLD TRACL
613 4470 EB XCHG ; DE ← end of tracing info.
614 4471 2AF243 LHLD UNTRL; HL ← start of tracing info.
615
616 4474 7D UNTR1: MOV A,L
617 4475 E60F ANI 1111B
618 4477 C29D44 JNZ UNTR2; Jump if not multiple of 16.
619
620 447A 3AC47F LDA KBLC
621 447D B7 ORA A
622 447E C2A844 JNZ UNTR5; Jump if user interrupts.
623
624 4481 3E0D MVI A,0DH; carriage-return
625 4483 CDC644 CALL SENDC
626 4486 3E0A MVI A,0AH; line-feed
627 4488 CDC644 CALL SENDC
628
629 448B 7A MOV A,D
630 448C BC CMP H
631 448D C29544 JNZ UNTR3; Jump if not done.
632 4490 7B MOV A,E
633 4491 BD CMP L
634 4492 CAA544 JZ UNTR4; Jump if done.
635
636 4495 7D UNTR3: MOV A,L; Send the current location.
637 4496 CDAE44 CALL SENDB
638 4499 7C MOV A,H
639 449A CDAE44 CALL SENDB
640
641 449D 7E UNTR2: MOV A,M
642 449E CDAE44 CALL SENDB
643 44A1 23 INX H
644 44A2 C37444 JMP UNTR1
645
646 44A5 210085 UNTR4: LXI H,8500H
647 44A8 22F243 UNTR5: SHLD UNTRL
648 44AB C32C40 JMP PRMPT
649
650 44AE F5 SENDB: PUSH PSW; This subroutine outputs a byte in hexadecimal form.
651 44AF 0F RRC
652 44B0 0F RRC
653 44B1 0F RRC
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 6-4
654 44B2 0F RRC
655 44B3 CD5201 CALL CDTAC; Convert left four bits to ascii.
656 44B6 CDC644 CALL SENDC
657 44B9 F1 POP PSW
658 44BA CD5201 CALL CDTAC; Convert right four bits to ascii.
659 44BD CDC644 CALL SENDC
660 44C0 3E20 MVI A,' '
661 44C2 CDC644 CALL SENDC
662 44C5 C9 RET
663
664 44C6 E5 SENDC: PUSH H; Outputs a character to the host.
665 44C7 21C801 LXI H,200+256; Delay about 10 milliseconds.
666 44CA CDF27D CALL DELAY
667 44CD E1 POP H
668 44CE D380 OUT RS232; Send the character.
669 44D0 C9 RET
670
671 ; Temporary interrupt jump table (later overlaid):
672 6000 ORG 6000H
673 6000 CD0D01 CALL ERROR; interrupt 0,
674 6003 00 NOP ; not used.
675 6004 CD0D01 CALL ERROR; interrupt 1,
676 6007 00 NOP ; not used.
677 6008 CD0D01 CALL ERROR; interrupt 2,
678 600B 00 NOP ; not used.
679 600C CD0D01 CALL ERROR; interrupt 3,
680 600F 00 NOP ; not used.
681 6010 CD0D01 CALL ERROR; interrupt 4,
682 6013 00 NOP ; not used.
683 6014 FB EI ; interrupt 5,
684 6015 C37301 JMP KBIS; keyboard.
685 6018 CD0D01 CALL ERROR; interrupt 6,
686 601B 00 NOP ; not used.
687 601C CD0D01 CALL ERROR; interrupt 7,
688 601F 00 NOP ; not used.
689
690 6020 00 INTSV: DB 0; interrupt status byte saved by QUIT.
691 6021 01 INTTP: DB 1; type of jump to QUIT.
692 6022 0000 INTSP: DW 0; stack pointer saved by QUIT.
693 6024 0000 INTCL: DW 0; clock reading saved by QUIT.
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 7
694 ; Beginning of instructions for on-line processing (non-overlaid area):
695 73A0 ORG 73A0H; This address to be adjusted so that page 20 comes out right.
696 73A0 D380 ABRT: OUT RS232; (Control reaches here from GET subroutine.)
697 73A2 11B97E ABRT1: LXI D,ABORT
698 73A5 CD1502 CALL DCS; Display " ABORTED."
699 73A8 D1 POP D; Do not return from GET.
700 73A9 0E0F RESET: MVI C,15; Delay about 15 seconds, to make sure that interrupts cease.
701 73AB 21204E REST1: LXI H,20000
702 73AE CDF27D CALL DELAY
703 73B1 0D DCR C
704 73B2 C2AB73 JNZ REST1
705
706 73B5 011700 REST2: LXI B,INITE-INITB; Initialize all variables that need it.
707 73B8 110B7F LXI D,INITV
708 73BB 21C37E LXI H,INITB
709 73BE 3EFF MVI A,11111111B
710 73C0 D3C1 OUT INT+1; Disable all interrupts (especially RDIS).
711 73C2 CDDC7D CALL MOVE
712 73C5 3E81 MVI A,10000001B
713 73C7 D3C1 OUT INT+1; Enable all six interrupts.
714
715 73C9 3A0D7F EOF: LDA READY; End-of-film command:
716 73CC 21C37F LXI H,FMBSY
717 73CF B6 ORA M
718 73D0 21C27F LXI H,LMBSY
719 73D3 B6 ORA M
720 73D4 C2C973 JNZ EOF; Wait until READY=FMBSY=LMBSY=0.
721
722 73D7 2A4F7F LHLD FMP
723 73DA EB XCHG
724 73DB 2A4B7F LHLD YHOME; Set up to move the feed motor to home position,
725 73DE CD927D CALL CMPD; after unclamping the film.
726 73E1 3E01 MVI A,1
727 73E3 C4A879 CNZ NCLMP
728
729 73E6 110000 LXI D,0; Start lens motor moving to home position.
730 73E9 CD6977 CALL LGO0
731
732 73EC 320C7F STA KBIB1; Clear keyboard buffer.
733
734 73EF 211C7F LXI H,MSLS
735 73F2 3E80 MVI A,10000000B
736 73F4 B6 ORA M
737 73F5 77 MOV M,A
738 73F6 D3DB OUT MSLCH; Turn audio signal on.
739
740 73F8 3E2A MVI A,'*'
741 73FA CD2302 CALL DC; Display an asterisk.
742 73FD C3BA74 JMP READ; Go on to read the next instruction.
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 8
743 ; Main scanning routine, returns the next byte of input in register A:
744
745 ; (Note: H and L are clobbered, but not B, C, D, or E. This subroutine
746 ; must not be called from within another subroutine, because of the way
747 ; it handles requests to ABORT the job.)
748
749 7400 2A127F GET: LHLD DQOUT; Spot in queue from which to get character.
750 7403 3A157F LDA QFLAG
751 7406 B7 ORA A
752 7407 CA2D74 JZ GET0; Jump if no transmission to the host was requested.
753
754 740A DB81 IN RS232+1
755 740C E605 ANI 101B
756 740E EE05 XRI 101B
757 7410 C22D74 JNZ GET0; Jump if the line is busy.
758
759 ; Now the line is "doubly free": the USART will be able to send a character
760 ; during an RS232 interrupt as well as the character we are about to send.
761
762 7413 3A157F LDA QFLAG
763 7416 FE0F CPI 00001111B
764 7418 CAA073 JZ ABRT; Jump if abortion requested.
765
766 741B 3A0E7F LDA DQIN
767 741E 95 SUB L; A ← buffer space in use.
768 741F FEC0 CPI 256-64
769 7421 D22D74 JNC GET0; Jump if there isn't room in buffer for another block.
770 ; If rA less than 256-64, there are at least 64 usable spaces in the buffer
771 ; (63 for data and one for the sum check byte). Buffer capacity is 255 bytes.
772
773 7424 3A157F QOK: LDA QFLAG; QFLAG contains the acknowledgment byte we wish to send.
774 7427 D380 OUT RS232
775 7429 97 SUB A
776 742A 32157F STA QFLAG; Zero the flag once it's sent.
777 ; If an interrupt occurs between this OUT and STA, with the host asking for a
778 ; current status report, we will transmit bit 1 = 1 instead of 0;
779 ; but the host will understand, since it just got the acknowledgment.
780
781 742D 3A107F GET0: LDA DQACK
782 7430 BD CMP L
783 7431 CA0074 JZ GET; Wait until the DQ input buffer is nonempty.
784
785 7434 7E MOV A,M; Fetch the next byte
786 7435 2C INR L
787 7436 22127F SHLD DQOUT; Advance the buffer pointer (wrapping mod 256).
788 7439 C9 RET
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 9
789 ; A program that prepares to typeset a character.
790
791 743A 4F TYPST: MOV C,A; Typeset-character command:
792 743B 3A0D7F TYP1: LDA READY
793 743E FE02 CPI 2
794 7440 D23B74 JNC TYP1; Wait until READY<2.
795
796 7443 2A277F LHLD LBIN
797 7446 71 MOV M,C; Store the character in LB.
798
799 7447 69 MOV L,C
800 7448 2600 MVI H,0
801 744A 29 DAD H
802 744B 29 DAD H
803 744C 111081 LXI D,CTB-10
804 744F 19 DAD D; HL←CTB table address for character.
805 7450 5E MOV E,M
806 7451 23 INX H
807 7452 56 MOV D,M; DE←repertoire address for character.
808 7453 210500 LXI H,5
809 7456 19 DAD D; HL←address of byte 6.
810
811 7457 5E MOV E,M
812 7458 23 INX H
813 7459 7E MOV A,M
814 745A E607 ANI 111B
815 745C 57 MOV D,A; DE←horizontal multiplier.
816 745D D5 PUSH D
817
818 745E 21002D LXI H,360*32
819 7461 CDA87D CALL MULTD; HL←[360a].
820 7464 E5 PUSH H
821
822 7465 CD0074 CALL GET
823 7468 5F MOV E,A
824 7469 CD0074 CALL GET
825 746C 57 MOV D,A; DE←desired character position in dot units.
826
827 746D CD0074 CALL GET
828 7470 4F MOV C,A; C←left cog increment.
829 7471 CD0074 CALL GET
830 7474 47 MOV B,A; B←right cog increment.
831
832 7475 3AE27F LDA STATE
833 7478 B7 ORA A
834 7479 FA7F74 JM TYP3; jump if LR state.
835
836 747C 79 MOV A,C; interchange left and right increments.
837 747D 48 MOV C,B
838 747E 47 MOV B,A
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 9-2
839
840 747F E1 TYP3: POP H
841 7480 CD987D CALL SUBD; DE←xshift.
842 7483 E1 POP H; HL←xmult.
843
844 7484 7A MOV A,D
845 7485 E607 ANI 111B; Compute and pack the msbs of xshift and xmult.
846 7487 0F RRC
847 7488 0F RRC
848 7489 0F RRC
849 748A 0F RRC
850 748B B4 ORA H; Now AE = xshift (will be stored in line buffer, msb first).
851 748C 2A277F LHLD LBIN
852 748F 23 INX H
853 7490 77 MOV M,A
854 7491 23 INX H
855 7492 73 MOV M,E
856 7493 97 SUB A
857 7494 57 MOV D,A
858 7495 58 MOV E,B
859
860 ; Now we have AC = starting cog increment, DE = ending cog increment,
861 ; and CB = bytes to be stored.
862
863 7496 23 TYP2: INX H
864 7497 71 MOV M,C
865 7498 23 INX H
866 7499 70 MOV M,B
867 749A 47 MOV B,A
868 749B 23 INX H
869
870 749C 3AE27F LDA STATE
871 749F B7 ORA A
872 74A0 FAB774 JM TYP4; Jump if LR state.
873
874 74A3 E5 PUSH H
875 74A4 2A2B7F LHLD RLI
876 74A7 09 DAD B
877 74A8 222B7F SHLD RLI
878 74AB 2A2D7F LHLD RLJ
879 74AE 19 DAD D
880 74AF 222D7F SHLD RLJ; Update cog accumulators for RL setting.
881
882 74B2 11F6FF LXI D,-10
883 74B5 E1 POP H
884 74B6 19 DAD D; RL state moves right to left in LB.
885 74B7 22277F TYP4: SHLD LBIN; Update line buffer position.
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 10
886 ; The main scanning loop, beginning a new instruction:
887
888 ; (Control "falls through" to here from the program on the previous page.)
889 74BA CD0074 READ: CALL GET; A←first byte.
890 74BD FE02 CPI 2
891 74BF D24D75 JNC READ1; Jump if 2 or more.
892
893 74C2 B7 ORA A
894 74C3 C22476 JNZ CMULT; Jump if 1.
895
896 74C6 CD0074 CALL GET; A←second byte.
897 74C9 FE02 CPI 2
898 74CB D2E774 JNC READ2; Jump if 2 or more.
899
900 74CE B7 ORA A
901 74CF C2067A JNZ BPAGE; Jump if 1.
902
903 74D2 CD0074 CALL GET; A←third byte.
904 74D5 B7 ORA A
905 74D6 CA5A76 JZ ADJC; Jump if 0.
906
907 74D9 4F DISPM: MOV C,A; Display-message command:
908 74DA CD0074 DISP1: CALL GET
909 74DD CD2302 CALL DC; Display one character.
910 74E0 0D DCR C
911 74E1 C2DA74 JNZ DISP1
912 74E4 C3BA74 JMP READ
913
914 74E7 CA7D7A READ2: JZ EOL; Jump if 2.
915
916 74EA 6F NEWCH: MOV L,A; New-character command:
917 74EB 2600 MVI H,0
918 74ED 29 DAD H
919 74EE 29 DAD H; HL←character code times 4.
920
921 74EF 110E81 LXI D,CTB-12
922 74F2 19 DAD D
923 74F3 E5 PUSH H; Save CTB table location for the new character.
924
925 74F4 CD0074 CALL GET
926 74F7 5F MOV E,A
927 74F8 CD0074 CALL GET
928 74FB 57 MOV D,A; DE←location in repertoire.
929
930 74FC CD0074 CALL GET
931 74FF 4F MOV C,A
932 7500 CD0074 CALL GET
933 7503 47 MOV B,A; BC←number of boundary data bytes.
934
935 7504 E1 POP H
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 10-2
936 7505 C5 PUSH B; Save number of bytes.
937
938 7506 71 MOV M,C; Store length in CTB table.
939 7507 23 INX H
940 7508 70 MOV M,B
941 7509 23 INX H
942
943 750A 73 MOV M,E; Store repertoire location in CTB table.
944 750B 23 INX H
945 750C 72 MOV M,D
946
947 750D 97 SUB A
948 750E B1 ORA C; Prepare to loop BC times.
949 750F CA1375 JZ NEW1
950 7512 04 INR B
951
952 7513 CD0074 NEW1: CALL GET; DE=address for next byte.
953 7516 12 STAX D
954 7517 13 INX D
955 7518 0D DCR C
956 7519 C21375 JNZ NEW1
957 751C 05 DCR B
958 751D C21375 JNZ NEW1
959
960 7520 97 SUB A; Now store the three final bytes.
961 7521 12 STAX D
962 7522 13 INX D
963 7523 12 STAX D
964 7524 13 INX D
965 7525 3EF8 MVI A,11111000B
966 7527 12 STAX D
967
968 7528 E1 POP H
969 7529 CD987D CALL SUBD; DE←address of third byte of boundary data.
970 752C 210300 LXI H,3
971 752F 19 DAD D; HL←address of byte 6.
972
973 7530 3A177F LDA AMULT; store horizontal multiplier.
974 7533 77 MOV M,A
975 7534 23 INX H
976 7535 3A187F LDA AMULT+1
977 7538 77 MOV M,A
978 7539 23 INX H
979
980 753A 3A197F LDA BMULT; store vertical multiplier.
981 753D 77 MOV M,A
982
983 753E 23 INX H
984 753F 3A1B7F LDA YSBM
985 7542 77 MOV M,A; Store msb of yshift and ymult.
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 10-3
986
987 7543 23 INX H
988 7544 23 INX H
989 7545 23 INX H
990 7546 3A1A7F LDA YSHFT
991 7549 77 MOV M,A; Store lsb of yshift.
992 754A C3BA74 JMP READ; Done inputting the new character, go to next instruction.
993
994 754D C23A74 READ1: JNZ TYPST; Jump if 3 or more.
995 7550 CD0074 CALL GET; A←second byte.
996 7553 FE02 CPI 2
997 7555 DA8B75 JC READ3; Jump if 0 or 1.
998 7558 CA1276 JZ FEED; Jump if 2.
999
1000 755B 6F SHUFF: MOV L,A; Shuffle command:
1001 755C 2600 MVI H,0
1002 755E 29 DAD H
1003 755F 29 DAD H
1004 7560 110E81 LXI D,CTB-12
1005 7563 19 DAD D
1006 7564 E5 PUSH H; Save CTB location for character to be moved.
1007
1008 7565 CD0074 CALL GET
1009 7568 5F MOV E,A
1010 7569 CD0074 CALL GET
1011 756C 57 MOV D,A; DE←new location.
1012
1013 756D E1 POP H
1014 756E 4E MOV C,M
1015 756F 23 INX H
1016 7570 46 MOV B,M; BC←number of boundary bytes.
1017
1018 7571 03 INX B
1019 7572 03 INX B
1020 7573 03 INX B
1021 7574 C5 PUSH B; Save the number of bytes to move.
1022
1023 7575 3A0D7F SHUF1: LDA READY; Wait until READY=0.
1024 7578 B7 ORA A
1025 7579 C27575 JNZ SHUF1
1026
1027 757C 23 INX H; Store new location in CTB table, prior to moving,
1028 757D 4E MOV C,M; meanwhile setting BC←old location.
1029 757E 73 MOV M,E
1030 757F 23 INX H
1031 7580 46 MOV B,M
1032 7581 72 MOV M,D
1033
1034 7582 69 MOV L,C
1035 7583 60 MOV H,B
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 10-4
1036 7584 C1 POP B
1037 7585 CDDC7D CALL MOVE; Move the data.
1038 7588 C3BA74 JMP READ; Advance to next command.
1039
1040 758B B7 READ3: ORA A
1041 758C C2C973 JNZ EOF; Jump if 1.
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 11
1042 ; Program to set a specified beam brightness.
1043
1044 ; (Control "falls through" from the READ routine on the preceding page.)
1045 758F CD0074 BRITE: CALL GET; Change-brightness command:
1046 7592 5F MOV E,A
1047 7593 CD0074 CALL GET
1048 7596 57 MOV D,A; DE←brightness parameter (0 to 3000).
1049
1050 7597 3A0D7F BRIT1: LDA READY
1051 759A 21C27F LXI H,LMBSY
1052 759D B6 ORA M
1053 759E 21C37F LXI H,FMBSY
1054 75A1 B6 ORA M
1055 75A2 C29775 JNZ BRIT1; Wait until READY=LMBSY=FMBSY=0.
1056
1057 75A5 D5 PUSH D
1058 75A6 21343C LXI H,3C34H; (.2351628457)
1059 75A9 CDA87D CALL MULTD; Multiply by exposure correction factor, giving HL = y, say.
1060
1061 75AC 29 DAD H
1062 75AD 29 DAD H
1063 75AE 29 DAD H
1064 75AF 29 DAD H
1065 75B0 29 DAD H
1066 75B1 7C MOV A,H; A ← [y/8] = z, say.
1067 75B2 29 DAD H; HL ← 64y.
1068
1069 75B3 F5 PUSH PSW
1070 75B4 2F CMA
1071 75B5 5F MOV E,A
1072 75B6 16FF MVI D,-1
1073 75B8 13 INX D; DE ← -z.
1074
1075 75B9 D398 OUT BEAMR; Reset beam position.
1076 75BB 011D7F LXI B,BTLS
1077 75BE 0A LDAX B
1078 75BF F620 ORI 20H
1079 75C1 02 STAX B; Set lens motor moving to the right
1080 75C2 D3DA OUT BTLCH; (so that the beam steps to the right).
1081
1082 75C4 010000 LXI B,0; Now comes a loop to set the brightness increments.
1083 75C7 DBDF BRIT2: IN BSTEP; Step the beam.
1084 75C9 03 INX B
1085 75CA 79 MOV A,C
1086 75CB E60F ANI 0FH
1087 75CD C2C775 JNZ BRIT2
1088 75D0 7C MOV A,H; Every 16 steps, store H in the brightness-increment memory.
1089 75D1 2F CMA
1090 75D2 D388 OUT BRT1
1091 75D4 D3A0 OUT BRT2
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 11-2
1092
1093 75D6 19 DAD D; HL ← HL plus or minus z.
1094 75D7 78 MOV A,B
1095 75D8 D620 SUI 20H
1096 75DA C2E275 JNZ BRIT3
1097
1098 75DD 57 MOV D,A; Now BC = 2000H, we have stored 512 bytes.
1099 75DE F1 POP PSW
1100 75DF 5F MOV E,A; Set DE ← +z.
1101
1102 75E0 0680 MVI B,80H; This is a dirty trick, it sets BC←8000H.
1103 75E2 FE80 BRIT3: CPI 80H
1104 75E4 C2C775 JNZ BRIT2; Jump if we haven't stored 1024 bytes.
1105
1106 75E7 2A517F LHLD LMP; Now move beam back into proper position.
1107 75EA 115BFC LXI D,-933
1108 75ED 19 DAD D
1109 75EE 7C MOV A,H
1110 75EF E63F ANI 3FH
1111 75F1 67 MOV H,A
1112 75F2 7D MOV A,L
1113 75F3 B7 ORA A
1114 75F4 CAF875 JZ BRIT4; Prepare to loop (LMP-933) mod 16192 times.
1115 75F7 24 INR H
1116 75F8 DBDF BRIT4: IN BSTEP
1117 75FA 2D DCR L
1118 75FB C2F875 JNZ BRIT4
1119 75FE 25 DCR H
1120 75FF C2F875 JNZ BRIT4
1121
1122 7602 E1 POP H; Set overall brightness.
1123 7603 11FF03 LXI D,1023
1124 7606 19 DAD D
1125 7607 7D MOV A,L
1126 7608 2F CMA
1127 7609 D388 OUT BRT1
1128 760B 7C MOV A,H
1129 760C 2F CMA
1130 760D D390 OUT BRT1+8
1131 760F C3BA74 JMP READ; Go on to the next command.
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 12
1132 ; Programs for simple adjustment commands.
1133
1134 7612 CD0074 FEED: CALL GET; Feed command:
1135 7615 5F MOV E,A
1136 7616 CD0074 CALL GET
1137 7619 57 MOV D,A; DE←amount to feed (in feed motor units).
1138
1139 761A 2A257F LHLD YBASE
1140 761D 19 DAD D
1141 761E 22257F SHLD YBASE; Update current value of YBASE.
1142 7621 C3BA74 JMP READ; Go on to the next command.
1143
1144 7624 CD0074 CMULT: CALL GET; Change-multipliers command:
1145 7627 5F MOV E,A
1146 7628 CD0074 CALL GET
1147 762B 57 MOV D,A
1148 762C EB XCHG
1149 762D 22177F SHLD AMULT; Store new horizontal multiplier.
1150
1151 7630 CD0074 CALL GET
1152 7633 5F MOV E,A
1153 7634 CD0074 CALL GET
1154 7637 57 MOV D,A
1155 7638 F5 PUSH PSW
1156 7639 EB XCHG
1157 763A 22197F SHLD BMULT; Store new vertical multiplier.
1158
1159 763D 11202E LXI D,369*32
1160 7640 CDA87D CALL MULTD; HL←[369b].
1161 7643 110501 LXI D,261
1162 7646 CD987D CALL SUBD; DE←yshift.
1163
1164 7649 7A MOV A,D
1165 764A E607 ANI 00000111B
1166 764C 0F RRC
1167 764D 0F RRC
1168 764E 0F RRC
1169 764F 0F RRC ; Rotate four bits.
1170 7650 E1 POP H
1171 7651 B4 ORA H; Pack leading bits of yshift and the multiplier.
1172 7652 57 MOV D,A
1173 7653 EB XCHG
1174 7654 221A7F SHLD YSHFT
1175
1176 7657 C3BA74 JMP READ; Go on to the next command.
1177
1178 765A 3A0D7F ADJC: LDA READY; Adjust-cogs command:
1179 765D FE02 CPI 2
1180 765F D25A76 JNC ADJC; Wait until READY<2.
1181
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 12-2
1182 7662 CD0074 CALL GET
1183 7665 4F MOV C,A
1184 7666 CD0074 CALL GET
1185 7669 47 MOV B,A; BC←amount of adjustment.
1186
1187 766A 1E00 MVI E,0
1188 766C 2A277F LHLD LBIN
1189 766F 73 MOV M,E; Store three zero bytes in the line buffer.
1190 7670 23 INX H
1191 7671 73 MOV M,E
1192 7672 23 INX H
1193 7673 73 MOV M,E
1194
1195 7674 50 MOV D,B
1196 7675 59 MOV E,C
1197 7676 C39674 JMP TYP2; Go to common routine with the Typeset command.
1198
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 13
1199 ; Interrupt handling for data received from computer or operator.
1200
1201 0069 MAGIC EQU 01101001B; Specially flagged byte for protocol.
1202
1203 7679 F5 RDIS: PUSH PSW; RS232 data interrupt service:
1204 767A E5 PUSH H
1205 767B D5 PUSH D
1206 767C 21167F LXI H,MFLAG; Look at protocol's magic-word flag.
1207 767F 7E MOV A,M
1208 7680 FE69 CPI MAGIC
1209 7682 DB80 IN RS232; Read in the new data.
1210 7684 CAB176 JZ PRTCL; Jump if MFLAG = magic.
1211
1212 7687 77 MOV M,A; MFLAG gets new data byte.
1213 7688 FE69 CPI MAGIC; Not in magic mode yet, check if magic word.
1214 768A CA5977 JZ POP3; Wait for second byte--the magic command.
1215
1216 768D 2A0E7F RDATA: LHLD DQIN; Just data, look at queue now.
1217 7690 77 MOV M,A; Store new byte of data.
1218
1219 7691 EB XCHG ; DE←DQIN.
1220 7692 210B7F LXI H,SUMCH
1221 7695 86 ADD M
1222 7696 77 MOV M,A; Update the sum check.
1223
1224 7697 EB XCHG ; HL←DQIN.
1225 7698 2C INR L; Advance line buffer pointer (wrapping mod 256).
1226 7699 3A127F LDA DQOUT
1227 769C BD CMP L
1228 769D CAA676 JZ OVRUN; Jump if buffer was already full (contained 255 bytes).
1229
1230 76A0 220E7F SHLD DQIN
1231 76A3 C35977 JMP POP3; Restore registers and return from the interrupt.
1232
1233 76A6 1610 OVRUN: MVI D,00010000B; Set overrun flag.
1234 76A8 21147F BAD: LXI H,OVFLG; Input character will be dropped (DQIN not updated).
1235 76AB 7E MOV A,M;
1236 76AC B2 ORA D; (Either of two errors here.)
1237 76AD 77 MOV M,A
1238 76AE C35977 JMP POP3; Restore registers and return.
1239
1240 76B1 3600 PRTCL: MVI M,0; Reset MFLAG.
1241
1242 76B3 FE69 CPI MAGIC
1243 76B5 CA8D76 JZ RDATA; Just a quoted character with the magic code 69H.
1244
1245 76B8 FE02 CPI 10B
1246 76BA CA0F77 JZ AQUIT; We just got a request to abort.
1247 76BD DAC576 JC ZORO; Command is 0 or 1.
1248
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 13-2
1249 76C0 1640 MVI D,01000000B; Byte > 2, but not 69H, must be sumcheck error.
1250 76C2 C3A876 JMP BAD; Store the error in OVFLG at BAD.
1251
1252 76C5 B7 ZORO: ORA A
1253 76C6 C21777 JNZ RPORT; Command=1, report our status.
1254
1255 76C9 210B7F LXI H,SUMCH
1256 76CC 7E MOV A,M; Get the sum check as of byte before 69H,0H pair.
1257 76CD 3600 MVI M,0; Set SUMCH←0.
1258
1259 76CF B7 ORA A
1260 76D0 21147F LXI H,OVFLG
1261 76D3 7E MOV A,M
1262 76D4 CAD976 JZ RDIS4; Jump if sum check was OK.
1263 76D7 F640 ORI 01000000B; Set bit indicating sum check failure.
1264
1265 76D9 57 RDIS4: MOV D,A; Save error bits.
1266 76DA 3600 MVI M,0; Clear OVFLG.
1267
1268 76DC 21157F LXI H,QFLAG
1269 76DF 7E MOV A,M
1270 76E0 B7 ORA A
1271 76E1 C25977 JNZ POP3; Return without acknowledgment if abort is pending.
1272
1273 76E4 DB81 IN RS232+1; Read state of USART chip.
1274
1275 76E6 E630 ANI 00110000B
1276 76E8 B2 ORA D; Merge error flags.
1277 76E9 57 MOV D,A
1278
1279 76EA 0F RRC
1280 76EB 0F RRC
1281 76EC 0F RRC
1282 76ED 0F RRC
1283 76EE B2 ORA D
1284 76EF EEF0 XRI 11110000B
1285 76F1 32157F STA QFLAG; Set QFLAG to acknowledgment byte with error flags.
1286
1287 76F4 E607 ANI 111B
1288 76F6 210E7F LXI H,DQIN
1289 76F9 C20477 JNZ RDIS6; Jump if there was an error.
1290
1291 76FC 35 DCR M; Decrease DQIN (i.e., drop the sum check byte).
1292 76FD 7E MOV A,M
1293 76FE 32107F STA DQACK; Set DQACK←DQIN (i.e., accept the last block).
1294 7701 C35977 JMP POP3; Return from interrupt.
1295
1296 7704 3E37 RDIS6: MVI A,00110111B;
1297 7706 D381 OUT RS232+1; Reset error flags in USART chip.
1298 7708 3A107F LDA DQACK
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 13-3
1299 770B 77 MOV M,A; Set DQIN←DQACK (i.e., reject the last block).
1300 770C C35977 JMP POP3; Return from interrupt.
1301
1302 770F 3E0F AQUIT: MVI A,00001111B
1303 7711 32157F STA QFLAG; Set flag so we will know to abort.
1304 7714 C35977 JMP POP3
1305
1306 7717 165A RPORT: MVI D,01011010B; Set rD ← status report with ack pending.
1307 7719 3A157F LDA QFLAG; Negative QFLAG means we'll acknowledge shortly.
1308 771C B7 ORA A
1309 771D FA2577 JM RPRT0
1310 7720 C22F77 JNZ RPRT1; Positive nonzero QFLAG is ABORT code, send one now.
1311 7723 1678 MVI D,01111000B; Set rD ← status report with ack not pending.
1312
1313 7725 3A1C7F RPRT0: LDA MSLS
1314 7728 B7 ORA A
1315 7729 7A MOV A,D; Copy report byte from D.
1316 772A F22F77 JP RPRT1; The sign of MSLS is set if waiting for film-change.
1317 772D EE11 XRI 00010001B
1318
1319 772F D380 RPRT1: OUT RS232; Send the status report and continue on.
1320 7731 C35977 JMP POP3
1321
1322
1323 7734 F5 KBIS1: PUSH PSW; Keyboard interrupt service when on-line:
1324 7735 E5 PUSH H
1325
1326 7736 DBDD IN DISPL
1327 7738 E60F ANI 0FH; Read keyboard code.
1328 773A 210C7F LXI H,KBIB1
1329 773D FE09 CPI 9
1330 773F C24D77 JNZ KBIS2; Jump if not "0".
1331
1332 7742 7E MOV A,M
1333 7743 FE05 CPI 5
1334 7745 C24D77 JNZ KBIS2; Jump if previous was not "3".
1335
1336 7748 3E0F MVI A,00001111B
1337 774A 32157F STA QFLAG; Prepare to abort when scanning resumes.
1338 ; `CALL DEBUG' or `JMP QUIT' could be substituted for `STA QFLAG' when debugging.
1339
1340 774D 77 KBIS2: MOV M,A; Store the code in KBIB1.
1341 774E C35A77 JMP POP2; Restore registers and return from the interrupt.
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 14
1342 ; Lens motor control routines:
1343
1344 7751 F5 LMIS: PUSH PSW; Lens motor interrupt service:
1345 7752 E5 PUSH H
1346 7753 D5 PUSH D
1347 7754 C5 PUSH B
1348 7755 CDC477 CALL LCYC; Do one lens cycle.
1349
1350 7758 C1 POP4: POP B; Return from interrupt, restoring all four register pairs.
1351 7759 D1 POP3: POP D
1352 775A E1 POP2: POP H
1353 775B 3E20 MVI A,20H
1354 775D F3 DI
1355 775E D3C0 OUT INT; Remove current bit from interrupt status register.
1356
1357 7760 DBC0 IN INT; A ← bits for other interrupts in service, if any.
1358 7762 B7 ORA A
1359 7763 CA6677 ISW: JZ ISW0; This address is modified if low-priority routine scheduled.
1360
1361 ; Note that low-priority routines must not be entered when an interrupt was
1362 ; interrupted, since the interrupt service register in the 8259 chip must
1363 ; record the true "fully nested" state of what interrupts are being serviced.
1364 7766 F1 ISW0: POP PSW
1365 7767 FB EI
1366 7768 C9 RET ; Return from interrupt.
1367
1368 ; The following subroutine begins a chain of events that will move the lens
1369 ; motor to position DE, including all necessary acceleration and deceleration.
1370 ; If A=0, the typesetting of a line will also be initiated at the proper time.
1371 7769 3E01 LGO0: MVI A,1; Special case of LGO when not typesetting.
1372 776B 32537F LGO: STA LTYPE
1373
1374 776E 2A517F LHLD LMP; HL←lens motor current position (in motor steps from home).
1375 7771 CD927D CALL CMPD
1376 7774 C8 RZ ; Return if already there.
1377
1378 7775 EB XCHG
1379 7776 22517F SHLD LMP; Store the position to be moved to.
1380
1381 7779 011D7F LXI B,BTLS
1382 777C 0A LDAX B
1383 777D DA8677 JC LGO1; Jump if movement will be towards the left (LMP decreasing).
1384
1385 7780 F620 ORI 00100000B; Set lens motor direction = right.
1386 7782 EB XCHG ; Interchange so that HL≤DE.
1387 7783 C38877 JMP LGO2
1388
1389 7786 E6DF LGO1: ANI 11011111B; Set lens motor direction = left.
1390 7788 02 LGO2: STAX B
1391 7789 D3DA OUT BTLCH
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 14-2
1392
1393 778B CD987D CALL SUBD; DE←number of motor steps needed, say n.
1394 778E D5 PUSH D
1395
1396 778F 1B DCX D
1397 7790 1B DCX D
1398 7791 7B MOV A,E
1399 7792 E6FC ANI 11111100B; Truncate n-2 to a multiple of 4.
1400 7794 5F MOV E,A
1401
1402 7795 215001 LXI H,84*4
1403 7798 CD927D CALL CMPD
1404 779B D29F77 JNC LGO3; Jump if (n-2)/4≥84.
1405
1406 779E EB XCHG
1407 779F D1 LGO3: POP D; Now HL is 4 times the number of acceleration cycles (≤4*84).
1408 77A0 CD987D CALL SUBD; Set DE ← n-HL = number of steps at top speed (≥2).
1409 77A3 EB XCHG
1410 77A4 225A7F SHLD LSTEP
1411
1412 77A7 7A MOV A,D
1413 77A8 0F RRC
1414 77A9 7B MOV A,E
1415 77AA 1F RAR
1416 77AB 5F MOV E,A; Set E ← twice the number of acceleration cycles (mod 256).
1417
1418 77AC 210F7E LXI H,TABLE
1419 77AF 22587F SHLD LRATE; Initialize the rate pointer.
1420 77B2 19 DAD D
1421 77B3 2600 MVI H,0
1422 77B5 22567F SHLD LLIM; Set LLIM←lsb of top-speed rate address, and set LSTAT←0.
1423
1424 77B8 CDEF7D CALL DELAY2; Make sure lens motor is resting.
1425 77BB CDC477 CALL LCYC; Do the first lens motor cycle.
1426
1427 77BE 3E01 MVI A,1
1428 77C0 32C27F STA LMBSY; Mark lens motor busy.
1429 77C3 C9 RET ; Return from the subroutine.
1430
1431 ; LSTAT=0 when accelerating, =1 at top speed, >1 when decelerating.
1432
1433 77C4 3A577F LCYC: LDA LSTAT; Subroutine to do one lens motor cycle:
1434 77C7 B7 ORA A
1435 77C8 C21E78 JNZ LCYC1; Jump if not accelerating.
1436
1437 77CB 3A567F LDA LLIM
1438 77CE 2A587F LHLD LRATE
1439 77D1 BD CMP L; (least significant bytes suffice for comparison)
1440
1441 77D2 5E MOV E,M
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 14-3
1442 77D3 23 INX H
1443 77D4 56 MOV D,M; DE ← current rate from table.
1444 77D5 CAFB77 JZ LCYC2; Jump if maximum rate achieved.
1445
1446 77D8 23 INX H
1447 77D9 22587F LCYC3: SHLD LRATE; Update location of next rate.
1448
1449 77DC 210100 LXI H,1; Take two steps.
1450
1451 77DF 3E70 LCYCS: MVI A,70H
1452 77E1 D3CB OUT LTIMR+3; Prepare for lens motor interrupt,
1453 77E3 7D MOV A,L
1454 77E4 D3C9 OUT LTIMR+1
1455 77E6 7C MOV A,H
1456 77E7 D3C9 OUT LTIMR+1; after HL+1 steps.
1457
1458 77E9 3AC27F LDA LMBSY
1459 77EC B7 ORA A
1460 77ED C2F477 JNZ LCYC4; Jump if not the first cycle.
1461 77F0 3E34 MVI A,34H
1462 77F2 D3CB OUT LTIMR+3; Stop the rate counter until it is loaded.
1463
1464 77F4 7B LCYC4: MOV A,E
1465 77F5 D3C8 OUT LTIMR
1466 77F7 7A MOV A,D
1467 77F8 D3C8 OUT LTIMR; Load rate DE.
1468 77FA C9 RET ; Return from subroutine or subsubroutine.
1469
1470 77FB 2A5A7F LCYC2: LHLD LSTEP; HL←number of steps to take at top speed.
1471 77FE 2B DCX H
1472 77FF CDDF77 CALL LCYCS
1473
1474 7802 3A537F LDA LTYPE
1475 7805 B7 ORA A
1476 7806 C21878 JNZ LCYC5; Jump if not setting a line.
1477
1478 7809 3E04 MVI A,4
1479 780B 32557F STA GTYPE
1480 780E 3A337F LDA CORR
1481 7811 D3CA OUT GTIMR
1482 7813 3A347F LDA CORR+1
1483 7816 D3CA OUT GTIMR; Set up timer interrupt that will enable output GO.
1484
1485 7818 3E01 LCYC5: MVI A,1; Set LSTAT = top speed (1).
1486 781A 32577F STA LSTAT
1487 781D C9 RET ; Return from subroutine.
1488
1489 781E 3E0F LCYC1: MVI A,TABLE AND 0FFH
1490 7820 32577F STA LSTAT; We are assuming that this is not 0 or 1!
1491 7823 2A587F LHLD LRATE
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 14-4
1492 7826 BD CMP L
1493 7827 CA3178 JZ LCYC7; Jump if minimum speed encountered.
1494
1495 782A 2B DCX H
1496 782B 56 MOV D,M
1497 782C 2B DCX H
1498 782D 5E MOV E,M
1499 782E C3D977 JMP LCYC3; Perform the next deceleration cycle.
1500
1501 7831 3E34 LCYC7: MVI A,34H
1502 7833 D3CB OUT LTIMR+3; Stop the motor.
1503 7835 3E70 MVI A,70H
1504 7837 D3CB OUT LTIMR+3
1505
1506 7839 97 SUB A
1507 783A 32C27F STA LMBSY; Clear LMBSY.
1508
1509 ; If rA is nonzero on entrance to CHBOL, we aren't servicing an interrupt.
1510 783D F5 CHBOL: PUSH PSW; Subroutine to check if new line can begin immediately.
1511 783E 3A0D7F LDA READY
1512 7841 B7 ORA A
1513 7842 CAE27B JZ POP1L; Return if READY=0.
1514
1515 7845 3AC27F LDA LMBSY
1516 7848 211E7F LXI H,FFLAG
1517 784B B6 ORA M
1518 784C 23 INX H
1519 784D B6 ORA M
1520 784E C2E27B JNZ POP1L; Return if LMBSY or FFLAG or LIP is nonzero.
1521
1522 ; It can be proved that a line won't be "begun" twice by this routine, because
1523 ; LIP was fetched after LMBSY and FFLAG. (But there would have been a problem
1524 ; if LIP had been fetched first! Namely if CHBOL is, say, being called by EOL,
1525 ; and if after fetching LIP=0 an interrupt makes FFLAG=0 or LMBSY=0.)
1526
1527 7851 34 INR M; Set LIP ← 1.
1528 7852 F1 POP PSW
1529 7853 B7 ORA A
1530 7854 C22A7B JNZ BOL; Jump if not servicing an interrupt now.
1531
1532 7857 215E78 LXI H,CHB1
1533 785A 226477 SHLD ISW+1; Otherwise schedule a low-priority routine.
1534 785D C9 RET
1535
1536 785E E5 CHB1: PUSH H; Beginning of low-priority routine.
1537 785F 216677 LXI H,ISW0
1538 7862 226477 SHLD ISW+1
1539 7865 FB EI
1540 7866 D5 PUSH D
1541 7867 C5 PUSH B
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 14-5
1542 7868 CD2A7B CALL BOL
1543 786B C3DF7B JMP POP4L
1544
1545 ; (Low-priority routines need to be scheduled so that there won't be long
1546 ; spells of interrupt service locking out the RS232 data interrupts.)
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 15
1547 ; Feed motor control routines:
1548
1549 786E F5 FMIS: PUSH PSW; Feed motor interrupt service:
1550 786F E5 PUSH H
1551 7870 D5 PUSH D
1552 7871 C5 PUSH B
1553 7872 CDF078 CALL FCYC; Do one feed cycle.
1554 7875 C35877 JMP POP4; Restore all registers and return from the interrupt.
1555
1556 ; The FGO subroutine begins a chain of events that will move the feed
1557 ; motor to position HL, including all necessary acceleration and deceleration,
1558 ; after which it does further actions depending on the contents of register A.
1559 ; A=1: Exit.
1560 ; A=2: Clear FFLAG when there is time for lens acceleration to begin,
1561 ; and clamp the film when the feed has stopped.
1562 ; A=3: After moving to HL, move to YB and do the actions for A=2.
1563
1564 7878 2ACE7F FGO4: LHLD YB
1565 787B 3E02 MVI A,2
1566
1567 787D 32547F FGO: STA FTYPE
1568
1569 7880 EB XCHG
1570 7881 2A4F7F LHLD FMP
1571 7884 CD927D CALL CMPD
1572
1573 7887 011D7F LXI B,BTLS
1574 788A 0A LDAX B
1575 788B D5 PUSH D
1576 788C DA9478 JC FGO1; Jump if moving upwards on film (FMP to decrease).
1577
1578 788F F640 ORI 01000000B; Set feed motor direction = down.
1579 7891 C39778 JMP FGO2
1580 7894 E6BF FGO1: ANI 10111111B; Set feed motor direction = up.
1581 7896 EB XCHG ; Make DE ≥ HL.
1582 7897 02 FGO2: STAX B
1583 7898 D3DA OUT BTLCH
1584
1585 789A CD987D CALL SUBD; Set DE ← number of feed steps needed, say n.
1586 789D 210200 LXI H,2
1587 78A0 CD927D CALL CMPD
1588 78A3 E1 POP H
1589 78A4 DA7878 JC FGO4; Jump if n≤1 (this case should happen only FTYPE=3).
1590
1591 78A7 224F7F SHLD FMP; Update feed motor position.
1592 78AA D5 PUSH D
1593
1594 78AB 1B DCX D
1595 78AC 1B DCX D
1596 78AD 7B MOV A,E
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 15-2
1597 78AE E6FC ANI 11111100B
1598 78B0 5F MOV E,A; Truncate n-2 to a multiple of 4.
1599
1600 78B1 217C00 LXI H,31*4
1601 78B4 CD927D CALL CMPD
1602 78B7 D2BB78 JNC FGO3; Jump if (n-2)/4≥31.
1603
1604 78BA 6B MOV L,E
1605 78BB D1 FGO3: POP D; Now HL is 4 times the number of acceleration cycles (≤4*31).
1606 78BC CD987D CALL SUBD; Set DE ← n-HL = number of steps to take at top speed (≥2).
1607 78BF 4D MOV C,L
1608
1609 78C0 2E1C MVI L,28
1610 78C2 CD927D CALL CMPD
1611 78C5 DACE78 JC FGO3A; Jump if DE < 28.
1612
1613 78C8 2E1A MVI L,26; FFLAG will be cleared 26 steps before deceleration.
1614 78CA CD987D CALL SUBD
1615 78CD 65 MOV H,L; (Otherwise it will be cleared just before deceleration.)
1616
1617 78CE 22617F FGO3A: SHLD FSTP2-1; Set FSTP2←H.
1618 78D1 EB XCHG
1619 78D2 22607F SHLD FSTP1; Set FSTP1←DE.
1620
1621 78D5 79 MOV A,C
1622 78D6 0F RRC
1623 78D7 5F MOV E,A; E ← twice the number of acceleration cycles.
1624 78D8 210F7E LXI H,TABLE
1625 78DB 225E7F SHLD FRATE; Initialize the rate pointer.
1626 78DE 97 SUB A
1627 78DF 19 DAD D
1628 78E0 67 MOV H,A
1629 78E1 225C7F SHLD FLIM; Set FLIM←lsb of top-speed rate address, and set FSTAT←0.
1630
1631 78E4 32C37F STA FMBSY
1632 78E7 CDF078 CALL FCYC; Do the first feed cycle.
1633
1634 78EA 3E01 MVI A,1
1635 78EC 32C37F STA FMBSY; Mark feed motor busy.
1636 78EF C9 RET
1637
1638 ; FSTAT=0 when accelerating, =1 at top speed, =2 when decelerating.
1639
1640 78F0 3A5D7F FCYC: LDA FSTAT; Subroutine to do one feed motor cycle:
1641 78F3 B7 ORA A
1642 78F4 C23D79 JNZ FCYC1; Jump if not accelerating.
1643
1644 78F7 2A5E7F LHLD FRATE
1645 78FA 3A5C7F LDA FLIM
1646 78FD BD CMP L
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 15-3
1647 78FE 5E MOV E,M; Set DE to current feed motor rate.
1648 78FF 23 INX H
1649 7900 56 MOV D,M
1650 7901 CA2779 JZ FCYC2; Jump if at top speed.
1651
1652 7904 23 INX H
1653 7905 225E7F FCYC3: SHLD FRATE; Update rate pointer.
1654
1655 7908 210100 LXI H,1; Take two steps.
1656
1657 790B 3E70 FCYCS: MVI A,70H
1658 790D D3D3 OUT FTIMR+3; Prepare for feed motor interrupt,
1659 790F 7D MOV A,L
1660 7910 D3D1 OUT FTIMR+1
1661 7912 7C MOV A,H
1662 7913 D3D1 OUT FTIMR+1; after HL+1 steps.
1663
1664 7915 3AC37F LDA FMBSY
1665 7918 B7 ORA A
1666 7919 C22079 JNZ FCYC4; Jump if not the first time.
1667
1668 791C 3E34 MVI A,34H
1669 791E D3D3 OUT FTIMR+3; Stop the rate counter until it is loaded.
1670
1671 7920 7B FCYC4: MOV A,E
1672 7921 D3D0 OUT FTIMR
1673 7923 7A MOV A,D
1674 7924 D3D0 OUT FTIMR; Load rate DE.
1675 7926 C9 RET ; Return from subroutine or subsubroutine.
1676
1677 7927 21E303 FCYC2: LXI H,995
1678 792A CD927D CALL CMPD
1679 792D D23179 JNC FCY2A
1680 7930 EB XCHG ; Ensure that the rate is ≥ 995.
1681
1682 7931 2A607F FCY2A: LHLD FSTP1
1683 7934 3E01 MVI A,1
1684 7936 325D7F STA FSTAT; Set FSTAT = top speed.
1685 7939 2B FCY2B: DCX H; HL = number of steps - 1.
1686 793A C30B79 JMP FCYCS
1687
1688 793D 0F FCYC1: RRC
1689 793E D26479 JNC FCYC6; Jump if decelerating.
1690
1691 7941 3E02 MVI A,2
1692 7943 325D7F STA FSTAT; Set FSTAT = decelerating.
1693
1694 7946 21547F LXI H,FTYPE
1695 7949 BE CMP M
1696 794A C25479 JNZ FCY1A; Jump if FTYPE≠2.
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 15-4
1697
1698 794D 97 SUB A
1699 794E 321E7F STA FFLAG; Clear FFLAG.
1700
1701 7951 CD3D78 CALL CHBOL; Check if line can begin.
1702
1703 7954 3A627F FCY1A: LDA FSTP2
1704 7957 B7 ORA A
1705 7958 CA6479 JZ FCYC6; Jump if no more steps to take at top speed.
1706
1707 795B 6F MOV L,A
1708 795C 2600 MVI H,0
1709 795E 11E303 LXI D,995; (If FSTP2≠0, top speed is 995.)
1710 7961 C33979 JMP FCY2B; Otherwise take them.
1711
1712 7964 3E0F FCYC6: MVI A,TABLE AND 0FFH
1713 7966 2A5E7F LHLD FRATE
1714 7969 BD CMP L
1715 796A CA7479 JZ FCYC7; Jump if done decelerating.
1716
1717 796D 2B DCX H
1718 796E 56 MOV D,M
1719 796F 2B DCX H; Set DE to previous rate.
1720 7970 5E MOV E,M
1721 7971 C30579 JMP FCYC3; Do the next deceleration cycle.
1722
1723 7974 3E34 FCYC7: MVI A,34H
1724 7976 D3D3 OUT FTIMR+3; Stop the motor.
1725 7978 3E70 MVI A,70H
1726 797A D3D3 OUT FTIMR+3
1727
1728 797C 3A547F FCYC8: LDA FTYPE
1729 797F 3D DCR A
1730 7980 32C37F STA FMBSY
1731 7983 C8 RZ ; Return with FMBSY=0 if FTYPE=1.
1732
1733 7984 FE02 CPI 2
1734 7986 C29879 JNZ FCYC9; Jump if FTYPE=2.
1735
1736 7989 321E7F STA FFLAG; Otherwise begin a low-level routine
1737 798C E1 POP H; that calls FGO again with FTYPE=2, moving to YB.
1738 798D 2ACE7F LHLD YB
1739 7990 224D7F SHLD YWANT
1740 7993 C1 POP B
1741 7994 D1 POP D
1742 7995 C3E479 JMP GPTI2
1743
1744 7998 211C7F FCYC9: LXI H,MSLS
1745 799B 7E MOV A,M
1746 799C F604 ORI 00000100B
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 15-5
1747 799E 77 MOV M,A
1748 799F D3DB OUT MSLCH; Clamp the film.
1749
1750 79A1 97 SUB A
1751 79A2 32557F STA GTYPE
1752 79A5 C3BD79 JMP NCL1; Set up timer interrupt and return.
1753
1754 ; The following subroutine is used to unclamp the film and start the feed motor.
1755 ; On entry, HL is the desired feed motor position, and A gives the type of
1756 ; feed action desired (as in FGO).
1757 79A8 32557F NCLMP: STA GTYPE; Set GTYPE to the future FTYPE code.
1758 79AB 32C37F STA FMBSY; Mark feed motor busy.
1759 79AE 321E7F STA FFLAG; Set FFLAG≠0.
1760 79B1 224D7F SHLD YWANT; Store desired feed position.
1761
1762 79B4 211C7F LXI H,MSLS
1763 79B7 7E MOV A,M
1764 79B8 E6FB ANI 11111011B
1765 79BA 77 MOV M,A
1766 79BB D3DB OUT MSLCH; Unclamp the film.
1767
1768 79BD D3CA NCL1: OUT GTIMR
1769 79BF 3EEA MVI A,234
1770 79C1 D3CA OUT GTIMR; Set up timer interrupt after about 30 milliseconds.
1771 79C3 C9 RET
1772
1773 ; GTYPE=0 means return after clamping; GTYPE=1,2,3 means feed after unclamping;
1774 ; GTYPE=4 means output GO should be enabled.
1775 79C4 F5 GPTIS: PUSH PSW; General-purpose timer interrupt service:
1776 79C5 E5 PUSH H
1777
1778 79C6 3A557F LDA GTYPE
1779 79C9 B7 ORA A
1780 79CA CADE79 JZ GPTI1; Jump if GTYPE=0.
1781
1782 79CD FE04 CPI 4
1783 79CF C2E479 JNZ GPTI2; Jump if GTYPE=1,2,3.
1784
1785 79D2 211D7F LXI H,BTLS
1786 79D5 7E MOV A,M
1787 79D6 F608 ORI 00001000B
1788 79D8 77 MOV M,A
1789 79D9 D3DA OUT BTLCH; Enable output GO.
1790 79DB C35A77 JMP POP2; Restore H and PSW, then return from interrupt.
1791
1792 79DE 32C37F GPTI1: STA FMBSY; Mark feed motor nonbusy.
1793 79E1 C35A77 JMP POP2; Restore H and PSW, then return from interrupt.
1794
1795 79E4 21ED79 GPTI2: LXI H,GPTI3; (Note that we can get here from FCYC8.)
1796 79E7 226477 SHLD ISW+1; Schedule a low-priority routine.
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 15-6
1797 79EA C35A77 JMP POP2
1798
1799 79ED E5 GPTI3: PUSH H; Beginning of low-priority routine.
1800 79EE 216677 LXI H,ISW0
1801 79F1 226477 SHLD ISW+1
1802 79F4 FB EI
1803 79F5 D5 PUSH D
1804 79F6 C5 PUSH B
1805
1806 79F7 CDEF7D CALL DELAY2; Wait about 2 milliseconds.
1807 79FA 2A4D7F LHLD YWANT
1808 79FD 3A1E7F LDA FFLAG
1809 7A00 CD7D78 CALL FGO; Unclamping is done, start the feed motor.
1810 7A03 C3DF7B JMP POP4L; Restore all registers and return from interrupt.
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 16
1811 ; Programs for beginning and ending the typesetting of a line or page.
1812
1813 7A06 CD0074 BPAGE: CALL GET; Begin-page command:
1814 7A09 5F MOV E,A
1815 7A0A CD0074 CALL GET
1816 7A0D 57 MOV D,A; DE←starting left cog.
1817
1818 7A0E 3A0D7F BP1: LDA READY
1819 7A11 21C37F LXI H,FMBSY
1820 7A14 B6 ORA M
1821 7A15 21C27F LXI H,LMBSY
1822 7A18 B6 ORA M
1823 7A19 C20E7A JNZ BP1; Wait until READY=FMBSY=LMBSY=0.
1824
1825 7A1C 211C7F BP2: LXI H,MSLS
1826 7A1F 7E MOV A,M
1827 7A20 B7 ORA A
1828 7A21 F23A7A JP BP3; Jump if not waiting for film loading.
1829 7A24 3A157F LDA QFLAG
1830 7A27 FE0F CPI 1111B
1831 7A29 CA3A7A JZ BP3; Go on if ABORT is pending.
1832
1833 7A2C 3A0C7F LDA KBIB1
1834 7A2F FE03 CPI 3
1835 7A31 C21C7A JNZ BP2; Wait until `5' is pushed on operator keypad.
1836
1837 7A34 7E MOV A,M
1838 7A35 E67F ANI 01111111B
1839 7A37 77 MOV M,A
1840 7A38 D3DB OUT MSLCH; Turn audio signal off.
1841
1842 7A3A 3EAA BP3: MVI A,10101010B
1843 7A3C 32E27F STA STATE
1844 7A3F 32E37F STA OUTST; Initialize line-setting states to LR.
1845
1846 7A42 CDDF7A CALL LREST; Compute lens motor rest position and associated corrections.
1847
1848 7A45 CD0074 CALL GET
1849 7A48 5F MOV E,A
1850 7A49 CD0074 CALL GET
1851 7A4C 57 MOV D,A; DE←desired baseline.
1852 7A4D D5 PUSH D
1853
1854 7A4E 210A00 LXI H,10
1855 7A51 19 DAD D
1856 7A52 22257F SHLD YBASE; (Actual baselines are 10 more than the host thinks.)
1857 7A55 22CE7F SHLD YB
1858
1859 7A58 2A417F LHLD LRCOR
1860 7A5B 22337F SHLD CORR
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 16-2
1861 7A5E 2A457F LHLD LRHSC
1862 7A61 22357F SHLD HCOG; Move line-begin parameters to proper place.
1863
1864 7A64 E1 POP H; HL←new baseline (less 10).
1865 7A65 3E03 MVI A,3
1866 7A67 CDA879 CALL NCLMP; Unclamp, move to HL, move to YB, clamp.
1867
1868 7A6A 2A477F LHLD LRRST
1869 7A6D EB XCHG
1870 7A6E CD6977 CALL LGO0; Simultaneously, move lens motor to initial position.
1871
1872 7A71 2A207F LHLD LB0
1873 7A74 22277F SHLD LBIN
1874 7A77 22297F SHLD LBOUT; Empty the line buffer.
1875 7A7A C3BA74 JMP READ; Go to next command.
1876
1877 7A7D CD0074 EOL: CALL GET; End-of-line command:
1878 7A80 5F MOV E,A
1879 7A81 CD0074 CALL GET
1880 7A84 57 MOV D,A; DE←ending cog.
1881 7A85 CDA07D CALL NEGD
1882 7A88 E5 PUSH H; Save -DE.
1883
1884 7A89 21E27F LXI H,STATE
1885 7A8C 7E MOV A,M
1886 7A8D 0F RRC
1887 7A8E 77 MOV M,A; Complement the state.
1888
1889 7A8F F5 PUSH PSW
1890 7A90 CDDF7A CALL LREST; Compute line end parameters.
1891 7A93 F1 POP PSW
1892
1893 7A94 2A257F LHLD YBASE
1894 7A97 EB XCHG
1895 7A98 2A277F LHLD LBIN
1896 7A9B DAB27A JC EOL1; Jump if the state was RL.
1897
1898 7A9E 22497F SHLD LRSTP; Store LR stopping position.
1899 7AA1 EB XCHG
1900 7AA2 22397F SHLD RLYB; Store new baseline for next line.
1901
1902 7AA5 E1 POP H
1903 7AA6 222B7F SHLD RLI; Initialize cog accumulators to -(right cog).
1904 7AA9 222D7F SHLD RLJ
1905
1906 7AAC 21FBBF LXI H,LBEND-5; Next line will appear at top end of line buffer.
1907 7AAF C3D17A JMP EOL2
1908
1909 7AB2 223F7F EOL1: SHLD RLSTP; Store RL starting position.
1910 7AB5 EB XCHG
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 16-3
1911 7AB6 22437F SHLD LRYB; Store new baseline for next line.
1912
1913 7AB9 C1 POP B
1914 7ABA 2A2B7F LHLD RLI
1915 7ABD CD9F7D CALL XNEGD
1916 7AC0 09 DAD B
1917 7AC1 22D67F SHLD COGID; First COGI correction is -(left cog)-RLI.
1918 7AC4 2A2D7F LHLD RLJ
1919 7AC7 CD9F7D CALL XNEGD
1920 7ACA 09 DAD B
1921 7ACB 22D87F SHLD COGJD; First COGJ correction is -(left cog)-RLJ.
1922
1923 7ACE 2A207F LHLD LB0; Next line will appear at bottom end of line buffer.
1924
1925 7AD1 22277F EOL2: SHLD LBIN
1926
1927 7AD4 210D7F LXI H,READY
1928 7AD7 34 INR M; Increase READY by 1.
1929 7AD8 7C MOV A,H; Make rA≠0.
1930 7AD9 CD3D78 CALL CHBOL; Check if new line can start now.
1931
1932 7ADC C3BA74 JMP READ; Proceed to the next command.
1933
1934 ; Subroutine to calculate lens resting positions, where DE is the cog position.
1935 7ADF D5 LREST: PUSH D; Save cog value c.
1936 7AE0 218407 LXI H,1924
1937 7AE3 CD987D CALL SUBD; DE←c-1924.
1938 7AE6 EB XCHG
1939 7AE7 29 DAD H
1940 7AE8 29 DAD H
1941 7AE9 29 DAD H
1942 7AEA 29 DAD H; HL←(c-1924)*16.
1943
1944 7AEB 11038D LXI D,8D03H; DE←correction factor (which is .55082703).
1945 ; This correction factor converts cogs/16 to motor steps.
1946 ; It equals (65536 x 3ms)/(16 x 610 x 558.03ns).
1947
1948 7AEE CDA87D CALL MULTD; Now HL = rest position, DE = fractional undershoot.
1949 7AF1 E5 PUSH H
1950
1951 7AF2 21A902 LXI H,681
1952 7AF5 CDA87D CALL MULTD; Now HL = undershoot, in units of timer clock cycles.
1953 ; 610 cycles on the motor clock is about 681 on the timer clock.
1954
1955 7AF8 3AE27F LDA STATE
1956 7AFB B7 ORA A
1957 7AFC FA157B JM LR1; Jump if LR state.
1958
1959 7AFF 117003 LXI D,681+200-1; Make the correction at least 200.
1960 7B02 CD987D CALL SUBD
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 16-4
1961 7B05 EB XCHG
1962 7B06 22377F SHLD RLCOR; RL correction in clock cycles.
1963 7B09 E1 POP H
1964 7B0A 223D7F SHLD RLRST; RL motor rest position.
1965 7B0D E1 POP H
1966 7B0E 23 INX H
1967 7B0F 23 INX H
1968 7B10 29 DAD H
1969 7B11 223B7F SHLD RLHSC; RL hardware starting cog is 2(c+2).
1970 7B14 C9 RET
1971
1972 7B15 11C800 LR1: LXI D,200; Make the correction at least 200.
1973 7B18 19 DAD D
1974 7B19 22417F SHLD LRCOR; LR correction in clock cycles.
1975 7B1C E1 POP H
1976 7B1D 22477F SHLD LRRST; LR motor rest position.
1977 7B20 E1 POP H
1978 7B21 11FEFF LXI D,-2
1979 7B24 19 DAD D
1980 7B25 29 DAD H
1981 7B26 22457F SHLD LRHSC; LR hardware starting cog is 2(c-2).
1982 7B29 C9 RET
1983
1984 ; The following subroutine is called when it's time to begin typesetting a line.
1985 7B2A 97 BOL: SUB A
1986 7B2B D3DF OUT RPLCH
1987
1988 7B2D 21357F LXI H,HCOG
1989 7B30 3E80 MVI A,10000000B
1990 7B32 B6 ORA M
1991 7B33 D3DF OUT RPLCH; Set up hardware cog counter.
1992
1993 7B35 3AE37F LDA OUTST
1994 7B38 0F RRC
1995 7B39 D24F7B JNC BOL1; Jump if output line to be left-to-right.
1996
1997 7B3C 2A477F LHLD LRRST
1998 7B3F E5 PUSH H; Save rest position at end of line.
1999
2000 7B40 2A3F7F LHLD RLSTP
2001 7B43 110500 LXI D,5
2002 7B46 19 DAD D; HL←starting position in line buffer.
2003 7B47 1100C0 LXI D,LBEND; DE←stopping position in line buffer.
2004 7B4A 3EBD MVI A,10111101B; A←right-to-left code.
2005 7B4C C35C7B JMP BOL2
2006
2007 7B4F 2A3D7F BOL1: LHLD RLRST
2008 7B52 E5 PUSH H; Save rest position at end of line.
2009
2010 7B53 2A497F LHLD LRSTP
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 16-5
2011 7B56 EB XCHG ; DE←stopping position in line buffer.
2012 7B57 2A207F LHLD LB0; HL←starting position in line buffer.
2013 7B5A 3E9D MVI A,10011101B; A←left-to-right code.
2014
2015 7B5C D3DF BOL2: OUT RPLCH; Set the hardware repeat latch.
2016 7B5E 22DA7F SHLD INSTB; Store the starting position.
2017 7B61 22DE7F SHLD INSTI; Initialize for reading the line buffer.
2018 7B64 22E07F SHLD INSTJ
2019
2020 7B67 EB XCHG
2021 7B68 22DC7F SHLD INSTE; Store the stopping position.
2022
2023 7B6B 97 SUB A
2024 7B6C 322F7F STA CHARI
2025 7B6F 32317F STA CHARJ; CHARI,CHARJ ← address of CHAR1 buffer.
2026
2027 7B72 D1 POP D
2028 7B73 CD6B77 CALL LGO; Start lens motor (which will enable GO in due time).
2029
2030 7B76 210000 LXI H,0
2031 7B79 E5 PUSH H; Get ready to jump into the SETUP routine,
2032 7B7A 2C INR L; with COG=0, COGI=1, COGJ=2.
2033 7B7B 22D27F SHLD COGI
2034 7B7E 2C INR L
2035 7B7F 22D47F SHLD COGJ
2036 7B82 3E80 MVI A,10000000B
2037 ; sta schk; (this instruction is for debugging)
2038 7B84 210181 LXI H,CHAR1+1
2039 7B87 C3037C JMP SET1A; Prepare for first scan-done interrupt.
2040 ; schk: db 0; (this byte is for debugging)
2041
2042 ; The effect of this somewhat tricky initialization is to set
2043 ; COG ← 1,
2044 ; COGI ← 2 + distance from line-begin cog to starting cog of first character.
2045 ; COGJ ← 2 + distance from line-begin cog to stopping cog of first character.
2046 ; INSTI, INSTJ ← line buffer address following the first character.
2047 ; CHAR1, CHAR2 ← blank characters.
2048 ; and the first scan-done interrupt will transmit blanks to the decoder boards.
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 17
2049 ; Processing of scan-done interrupts:
2050 7B8A F5 SDIS: PUSH PSW
2051 7B8B E5 PUSH H
2052
2053 ; lda schk; Debugging code to check if we blew it.
2054 ; ora a
2055 ; jz sch1
2056 ; mvi a,'!'
2057 ; call dc; This instruction can be replaced by `JMP QUIT'.
2058 ; sch1: mvi a,1
2059 ; sta schk
2060
2061 7B8C 2A237F LHLD LNGTH
2062 7B8F 7C MOV A,H
2063 7B90 B7 ORA A
2064 7B91 FAC77B JM SDIS1; Jump if no DMA needed.
2065 7B94 7D MOV A,L
2066 7B95 D3D2 OUT DMA
2067 7B97 7C MOV A,H
2068 7B98 D3D2 OUT DMA; Send DMA count for character 1.
2069 7B9A 2A0781 LHLD C1DI
2070 7B9D 7D MOV A,L
2071 7B9E D3D8 OUT DMA+6
2072 7BA0 7C MOV A,H
2073 7BA1 D3D9 OUT DMA+7; Send DMA address for character 1.
2074 7BA3 D3DC OUT DMA+10; DMA character 1 (CPU stops till done).
2075
2076 7BA5 3A0A81 LDA C2NB7
2077 7BA8 2A0B81 LHLD C2B7A; HL←byte 7 address for character 2.
2078 7BAB 77 MOV M,A; Store new byte 7. (Note that character 1 might
2079 7BAC 23 INX H; equal character 2, hence these variable bytes
2080 7BAD 23 INX H; aren't stored until after the DMA of character 1.)
2081 7BAE 23 INX H
2082 7BAF 3A0D81 LDA C2NBA
2083 7BB2 77 MOV M,A; Store new byte 10.
2084
2085 7BB3 2A0E81 LHLD C2DC
2086 7BB6 7D MOV A,L
2087 7BB7 D3D2 OUT DMA; Send lsb of DMA count.
2088 7BB9 7C MOV A,H
2089 7BBA D3D2 OUT DMA; Send msb of DMA count.
2090
2091 7BBC 2A1081 LHLD C2DI
2092 7BBF 7D MOV A,L
2093 7BC0 D3D8 OUT DMA+6; Send lsb of DMA info.
2094 7BC2 7C MOV A,H
2095 7BC3 D3D9 OUT DMA+7; Send msb of DMA info.
2096
2097 7BC5 D3DC OUT DMA+10; DMA character 2 (CPU stops till done).
2098
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 17-2
2099 7BC7 DBDE SDIS1: IN COLL; Start next collection.
2100 ; Whew. That was the critical path, whose aim was to start collecting as
2101 ; soon as possible. Now we have more time to breathe.
2102
2103 7BC9 21D27B LXI H,SDIS2; Schedule a low-priority routine.
2104 7BCC 226477 SHLD ISW+1
2105 7BCF C35A77 JMP POP2
2106
2107 7BD2 E5 SDIS2: PUSH H; Beginning of low-priority routine.
2108 7BD3 216677 LXI H,ISW0
2109 7BD6 226477 SHLD ISW+1
2110 7BD9 FB EI
2111 7BDA D5 PUSH D
2112 7BDB C5 PUSH B
2113 7BDC CDE47B CALL SETUP; Get ready for the next scan-done interrupt.
2114
2115 7BDF C1 POP4L: POP B; Return from specially-scheduled low-priority routine.
2116 7BE0 D1 POP3L: POP D
2117 7BE1 E1 POP2L: POP H
2118 7BE2 F1 POP1L: POP PSW
2119 7BE3 C9 RET
2120
2121 ; The following subroutine prepares for the next scan-done interrupt.
2122 7BE4 3E80 SETUP: MVI A,10000000B
2123 7BE6 32227F STA SFLAG; SFLAG negative means that no DMA is needed.
2124
2125 7BE9 2AD07F LHLD COG
2126 7BEC EB XCHG ; DE←current software cog.
2127
2128 7BED 2AD47F SET1: LHLD COGJ
2129 7BF0 CD927D CALL CMPD
2130 7BF3 C2507C JNZ SET2; Jump if no character is due to exit.
2131
2132 7BF6 97 SUB A
2133 7BF7 32227F STA SFLAG; Specify that DMA is needed.
2134
2135 7BFA D5 PUSH D
2136 7BFB 2A317F LHLD CHARJ
2137 7BFE 7E MOV A,M
2138 7BFF 32317F STA CHARJ; Swap character buffers.
2139
2140 7C02 23 INX H
2141 7C03 CDD57D SET1A: CALL MOVBL; Blank out the previous character.
2142
2143 7C06 2ADC7F SET1B: LHLD INSTE; Advance J to the next character to exit:
2144 7C09 EB XCHG
2145 7C0A 2AE07F LHLD INSTJ
2146 7C0D CD927D CALL CMPD
2147 7C10 CA2D7C JZ SET1C; Jump if at end of line buffer.
2148
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 17-3
2149 7C13 7E MOV A,M; A←first byte of line buffer entry.
2150 7C14 23 INX H
2151 7C15 23 INX H
2152 7C16 23 INX H
2153 7C17 4E MOV C,M; C←fourth byte.
2154 7C18 23 INX H
2155 7C19 5E MOV E,M; E←fifth byte.
2156
2157 7C1A 23 INX H
2158 7C1B 22E07F SHLD INSTJ; Advance line buffer pointer.
2159
2160 7C1E 2AD47F LHLD COGJ
2161 7C21 B7 ORA A
2162 7C22 C2337C JNZ SET1D; Jump if line buffer entry was a Typeset command.
2163
2164 7C25 43 MOV B,E; BC←cog adjustment.
2165 7C26 09 DAD B
2166 7C27 22D47F SHLD COGJ; Update ending cog.
2167 7C2A C3067C JMP SET1B; Return to advance some more.
2168
2169 7C2D 21FFFF SET1C: LXI H,0FFFFH; HL←infinity.
2170 7C30 C3497C JMP SET1F; (Now COGJ will have an impossible value.)
2171
2172 7C33 1600 SET1D: MVI D,0
2173 7C35 3AE37F LDA OUTST
2174 7C38 B7 ORA A
2175 7C39 FA487C JM SET1E; Jump if setting LR.
2176
2177 7C3C D5 PUSH D
2178 7C3D EB XCHG
2179 7C3E 2AD87F LHLD COGJD
2180 7C41 19 DAD D
2181 7C42 EB XCHG
2182 7C43 E1 POP H; If going RL, we assign COGJ←COGJ+COGJD, COGJD←DE.
2183 7C44 22D87F SHLD COGJD
2184
2185 7C47 6C MOV L,H; HL←0.
2186 7C48 19 SET1E: DAD D; If going LR, we simply assign COGJ←COGJ+DE.
2187
2188 7C49 22D47F SET1F: SHLD COGJ; Update ending cog.
2189 7C4C D1 POP D
2190 7C4D C3ED7B JMP SET1; Check if the next character wants to exit, too.
2191
2192 7C50 13 SET2: INX D; Increase software cog counter.
2193 7C51 EB XCHG
2194 7C52 22D07F SHLD COG
2195 7C55 EB XCHG
2196
2197 7C56 210300 LXI H,3
2198 7C59 CD927D CALL CMPD
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 17-4
2199 7C5C C2687C JNZ SET3; Jump if not time to turn video on.
2200
2201 7C5F 211C7F LXI H,MSLS
2202 7C62 7E MOV A,M
2203 7C63 F608 ORI 00001000B
2204 7C65 77 MOV M,A
2205 7C66 D3DB OUT MSLCH; Video on (blanks are being transmitted).
2206
2207 7C68 2AD27F SET3: LHLD COGI
2208 7C6B CD927D CALL CMPD
2209 7C6E C2197D JNZ SET4; Jump if no character is due to enter.
2210
2211 7C71 97 SUB A
2212 7C72 32227F STA SFLAG; Specify that DMA is needed.
2213
2214 7C75 D5 PUSH D; Save COG.
2215 7C76 2ADA7F LHLD INSTB
2216 7C79 EB XCHG
2217 7C7A 2ADE7F LHLD INSTI
2218 7C7D CD927D CALL CMPD
2219 7C80 CAC57C JZ SET3A; Jump if INSTI=INSTB.
2220
2221 7C83 11FBFF LXI D,-5
2222 7C86 19 DAD D; Go back to look at previous line buffer entry.
2223 7C87 22C67F SHLD TEMP
2224
2225 7C8A 6E MOV L,M; L←entering character reference code.
2226 7C8B 2600 MVI H,0
2227 7C8D 29 DAD H
2228 7C8E 29 DAD H
2229 7C8F 110E81 LXI D,CTB-12
2230 7C92 19 DAD D; HL←CTB table location for character.
2231
2232 7C93 4E MOV C,M
2233 7C94 23 INX H
2234 7C95 46 MOV B,M; BC←number of boundary data bytes.
2235
2236 7C96 23 INX H
2237 7C97 5E MOV E,M
2238 7C98 23 INX H
2239 7C99 56 MOV D,M; DE←repertoire location.
2240
2241 7C9A D5 PUSH D
2242 7C9B 210600 LXI H,6
2243 7C9E 19 DAD D
2244 7C9F E5 PUSH H; Save location of byte 7.
2245
2246 7CA0 2AC67F LHLD TEMP
2247 7CA3 EB XCHG ; DE←location in line buffer.
2248
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 17-5
2249 7CA4 2A2F7F LHLD CHARI
2250 7CA7 7E MOV A,M
2251 7CA8 322F7F STA CHARI; Swap character buffers.
2252 7CAB 23 INX H; HL←location to store character info.
2253
2254 7CAC 13 INX D
2255 7CAD 1A LDAX D; A←new byte 7 for character.
2256 7CAE 77 MOV M,A; Store new byte 7.
2257
2258 7CAF 13 INX D
2259 7CB0 1A LDAX D; A←new byte 10 for character.
2260
2261 7CB1 D1 POP D
2262 7CB2 23 INX H
2263 7CB3 73 MOV M,E
2264 7CB4 23 INX H
2265 7CB5 72 MOV M,D; Store address of byte 7.
2266
2267 7CB6 23 INX H
2268 7CB7 77 MOV M,A; Store new byte 10.
2269
2270 7CB8 23 INX H
2271 7CB9 03 INX B
2272 7CBA 71 MOV M,C
2273 7CBB 23 INX H
2274 7CBC 70 MOV M,B; Store DMA count.
2275
2276 7CBD D1 POP D
2277 7CBE 23 INX H
2278 7CBF 73 MOV M,E
2279 7CC0 23 INX H
2280 7CC1 72 MOV M,D; Store address of byte 1.
2281 7CC2 C3CF7C JMP SET3B
2282
2283 7CC5 210A81 SET3A: LXI H,CHAR2+1; (We get here when initializing.)
2284 7CC8 CDD57D CALL MOVBL; Blank out character 2.
2285 7CCB 21D27F LXI H,COGI
2286 7CCE 34 INR M; Change COGI to 2.
2287
2288 7CCF 2ADC7F SET3B: LHLD INSTE; Advance I to next entering character:
2289 7CD2 EB XCHG
2290 7CD3 2ADE7F LHLD INSTI
2291 7CD6 CD927D CALL CMPD
2292 7CD9 CAF67C JZ SET3C; Jump if at end of line buffer.
2293
2294 7CDC 7E MOV A,M; A←first byte of line buffer command.
2295 7CDD 23 INX H
2296 7CDE 23 INX H
2297 7CDF 23 INX H
2298 7CE0 5E MOV E,M; E←fourth byte.
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 17-6
2299 7CE1 23 INX H
2300 7CE2 4E MOV C,M; C←fifth byte.
2301
2302 7CE3 23 INX H
2303 7CE4 22DE7F SHLD INSTI; Advance pointer.
2304
2305 7CE7 2AD27F LHLD COGI
2306 7CEA B7 ORA A
2307 7CEB C2FC7C JNZ SET3D; Jump if current entry is a Typeset command.
2308
2309 7CEE 51 MOV D,C; DE←cog adjustment.
2310 7CEF 19 DAD D
2311 7CF0 22D27F SHLD COGI; Update beginning cog.
2312 7CF3 C3CF7C JMP SET3B; Return to advance again.
2313
2314 7CF6 21FFFF SET3C: LXI H,0FFFFH; HL←infinity.
2315 7CF9 C3127D JMP SET3F; (Now COGI will be set to an impossible value.)
2316
2317 7CFC 1600 SET3D: MVI D,0
2318 7CFE 3AE37F LDA OUTST
2319 7D01 B7 ORA A
2320 7D02 FA117D JM SET3E; Jump if setting LR.
2321
2322 7D05 D5 PUSH D
2323 7D06 EB XCHG
2324 7D07 2AD67F LHLD COGID
2325 7D0A 19 DAD D
2326 7D0B EB XCHG
2327 7D0C E1 POP H; If going RL, we assign COGI←COGI+COGID, COGID←DE.
2328 7D0D 22D67F SHLD COGID
2329
2330 7D10 6C MOV L,H; HL←0.
2331 7D11 19 SET3E: DAD D; If going LR, we simply assign COGI←COGI+DE.
2332
2333 7D12 22D27F SET3F: SHLD COGI; Update beginning cog.
2334
2335 7D15 D1 POP D; DE←COG.
2336 7D16 C3687C JMP SET3; Check if another character wants to enter.
2337
2338 7D19 3A227F SET4: LDA SFLAG
2339 7D1C B7 ORA A
2340 7D1D FA397D JM SET6; Jump if SFLAG is negative (no DMA to set up).
2341
2342 7D20 3A0181 LDA C1NB7; Get ready to DMA character 1.
2343 7D23 2A0281 LHLD C1B7A
2344 7D26 77 MOV M,A; Store new byte 7.
2345 7D27 23 INX H
2346 7D28 23 INX H
2347 7D29 23 INX H
2348 7D2A 3A0481 LDA C1NBA
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 17-7
2349 7D2D 77 MOV M,A; Store new byte 10.
2350
2351 7D2E 2A0581 LHLD C1DC
2352 7D31 11FDFF LXI D,-3
2353 7D34 19 DAD D
2354 7D35 22237F SHLD LNGTH; Set LNGTH to DMA count for character 1 (which is positive).
2355
2356 ; set5: sub a
2357 ; sta schk; Temporary code to check if we made it before interrupt.
2358 7D38 C9 RET
2359
2360 7D39 32247F SET6: STA LNGTH+1; Set LNGTH negative.
2361 7D3C 3A577F LDA LSTAT
2362 7D3F FE02 CPI 2
2363 ; jc set5; (temporary code for debugging, replaces the following `RC')
2364 7D41 D8 RC ; Return if current line not finished.
2365
2366 7D42 211D7F LXI H,BTLS; We have just finished typesetting a line (LTYPE=0).
2367 7D45 7E MOV A,M
2368 7D46 E6F7 ANI 11110111B
2369 7D48 77 MOV M,A
2370 7D49 D3DA OUT BTLCH; Disable output GO.
2371
2372 7D4B 21E37F LXI H,OUTST
2373 7D4E 7E MOV A,M
2374 7D4F 0F RRC
2375 7D50 77 MOV M,A; Interchange RL with LR in preparation for the next line.
2376 7D51 D2627D JNC SET7; Jump if current line was LR.
2377
2378 7D54 2A437F LHLD LRYB
2379 7D57 E5 PUSH H
2380 7D58 2A417F LHLD LRCOR
2381 7D5B EB XCHG
2382 7D5C 2A457F LHLD LRHSC
2383 7D5F C36D7D JMP SET8
2384
2385 7D62 2A397F SET7: LHLD RLYB
2386 7D65 E5 PUSH H
2387 7D66 2A377F LHLD RLCOR
2388 7D69 EB XCHG
2389 7D6A 2A3B7F LHLD RLHSC
2390 7D6D 22357F SET8: SHLD HCOG; Move the next line's parameters into position.
2391 7D70 2A4F7F LHLD FMP
2392 7D73 EB XCHG
2393 7D74 22337F SHLD CORR
2394
2395 7D77 E1 POP H
2396 7D78 CD927D CALL CMPD; HL = new baseline, DE = current baseline.
2397 7D7B 3E02 MVI A,2
2398 7D7D C4A879 CNZ NCLMP; If next line has different baseline, unclamp the
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 17-8
2399 ; film and prepare to move to it while the lens motor slows down.
2400
2401 7D80 211C7F LXI H,MSLS
2402 7D83 7E MOV A,M
2403 7D84 E6F7 ANI 11110111B
2404 7D86 77 MOV M,A
2405 7D87 D3DB OUT MSLCH; Turn off video.
2406
2407 7D89 210D7F LXI H,READY
2408 7D8C 35 DCR M; READY←READY-1.
2409
2410 7D8D 97 SUB A
2411 7D8E 321F7F STA LIP; LIP←0.
2412 7D91 C9 RET
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 18
2413 ; Handy general-purpose subroutines:
2414
2415 ; Double compare, sets zero and carry flags like CMP does.
2416 ; DE plays the role of A and HL is the operand.
2417 ; (CALL CMPD takes 37 or 50 clock cycles.)
2418 7D92 7A CMPD: MOV A,D
2419 7D93 BC CMP H
2420 7D94 C0 RNZ
2421 7D95 7B MOV A,E
2422 7D96 BD CMP L
2423 7D97 C9 RET
2424
2425 ; Double subtract, DE plays the role of A and HL is the operand. (Takes 55 cycles.)
2426 7D98 7B SUBD: MOV A,E
2427 7D99 95 SUB L
2428 7D9A 5F MOV E,A
2429 7D9B 7A MOV A,D
2430 7D9C 9C SBB H
2431 7D9D 57 MOV D,A
2432 7D9E C9 RET
2433
2434 ; Double negation, HL←-DE. (56 cycles.)
2435 7D9F EB XNEGD: XCHG ; XNEGD sets DE←HL and HL←-HL.
2436 7DA0 97 NEGD: SUB A
2437 7DA1 93 SUB E
2438 7DA2 6F MOV L,A
2439 7DA3 3E00 MVI A,0
2440 7DA5 9A SBB D
2441 7DA6 67 MOV H,A
2442 7DA7 C9 RET
2443
2444 ; Double multiply, HLDE ← HL times DE. (Takes 1126 cycles.)
2445 7DA8 7D MULTD: MOV A,L
2446 7DA9 E5 PUSH H
2447 7DAA 0E02 MVI C,2; Stack=H0L0; C=2 and A=L0.
2448 7DAC 0608 MULT1: MVI B,8
2449 7DAE 210000 LXI H,0; HL←0.
2450 7DB1 29 MULT2: DAD H
2451 7DB2 17 RAL ; AHL←2AHL.
2452 7DB3 D2B97D JNC MULT3
2453 7DB6 19 DAD D; If carry out of rA, AHL←AHL+DE.
2454 7DB7 CE00 ACI 0
2455 7DB9 05 MULT3: DCR B
2456 7DBA C2B17D JNZ MULT2; Repeat eight times.
2457 7DBD 0D DCR C
2458 7DBE CACC7D JZ MULT4
2459 7DC1 C1 POP B; Now AHL=DExL0=A1H1L1, and BC=H0L0.
2460 7DC2 E5 PUSH H; Stack=H1L1.
2461 7DC3 6C MOV L,H
2462 7DC4 67 MOV H,A
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 18-2
2463 7DC5 E5 PUSH H; Stack=H1L1,A1H1.
2464 7DC6 78 MOV A,B
2465 7DC7 0E01 MVI C,1
2466 7DC9 C3AC7D JMP MULT1; Stack holds A1H1L1; C=1 and A=H0.
2467 7DCC D1 MULT4: POP D; Now AHL=D0E0xH0, and DE=A1H1.
2468 7DCD 19 DAD D
2469 7DCE CE00 ACI 0; AHL←AHL+A1H1.
2470 7DD0 D1 POP D; Now AHLE = H0L0xD0E0, the desired product.
2471 7DD1 55 MOV D,L
2472 7DD2 6C MOV L,H
2473 7DD3 67 MOV H,A
2474 7DD4 C9 RET
2475
2476 ; Move BC bytes from location HL to location DE.
2477 ; (Takes 39BC+15B+65 cycles, minus 20 if C=0.)
2478 7DD5 111281 MOVBL: LXI D,BLANK; Special case to move "blank" character info.
2479 7DD8 010800 LXI B,8
2480 7DDB EB XCHG
2481 7DDC 97 MOVE: SUB A; Prepare to loop BC times.
2482 7DDD B1 ORA C
2483 7DDE CAE27D JZ MOVE1
2484 7DE1 04 INR B
2485
2486 7DE2 7E MOVE1: MOV A,M; Move one byte.
2487 7DE3 12 STAX D
2488 7DE4 23 INX H; Advance pointers.
2489 7DE5 13 INX D
2490 7DE6 0D DCR C
2491 7DE7 C2E27D JNZ MOVE1
2492 7DEA 05 DCR B
2493 7DEB C2E27D JNZ MOVE1
2494 7DEE C9 RET
2495
2496 7DEF 214F01 DELAY2: LXI H,79+256; Delays about 2 milliseconds.
2497 7DF2 E3 DELAY: XTHL ; Delays 25.5(HL-256) microseconds, assuming that L≠0.
2498 7DF3 E3 XTHL ; 18+18+5+10 = 51 cycles = 25.5 microseconds.
2499 7DF4 2D DCR L
2500 7DF5 C2F27D JNZ DELAY
2501 7DF8 25 DCR H
2502 7DF9 C2F27D JNZ DELAY
2503 7DFC C9 RET
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 19
2504 ; Constants and special tables.
2505
2506 7DFD 00 BLNK: DB 0; Boundary data for a blank:
2507 7DFE 00 DB 0; u7u6u5u4u3u2u1u0
2508 7DFF F8 DB 11111000B; d2d1d0z z uAu9u8
2509 7E00 FF DB 11111111B; v7v6v5v4v3v2v1v0
2510 7E01 07 DB 00000111B; 0 0 0 0 s vAv9v8
2511 7E02 FF DB 11111111B; a7a6a5a4a3a2a1a0
2512 7E03 07 DB 00000111B; 0 xAx9x80 aAa9a8
2513 7E04 FF DB 11111111B; b7b6b5b4b3b2b1b0
2514 7E05 07 DB 00000111B; 0 yAy9y80 bAb9b8
2515 7E06 FF DB 11111111B; x7x6x5x4x3x2x1x0
2516 7E07 00 DB 0; (not used)
2517 7E08 00 DB 0; y7y6y5y4y3y2y1y0
2518 7E09 00 DB 0; (not used)
2519 7E0A C0 DB 11000000B; null boundary
2520 7E0B 00 DB 0; end of boundary data
2521 7E0C 0000F8 DB 0,0,0F8H; standard ending
2522
2523 7E0F 000E TABLE: DW 3584; Acceleration and deceleration table for motors.
2524 7E11 000E DW 3584
2525 7E13 AB0B DW 2987
2526 7E15 3E0A DW 2622
2527 7E17 4109 DW 2369
2528 7E19 8208 DW 2178
2529 7E1B ED07 DW 2029
2530 7E1D 7207 DW 1906
2531 7E1F 0C07 DW 1804
2532 7E21 B506 DW 1717
2533 7E23 6A06 DW 1642
2534 7E25 2806 DW 1576
2535 7E27 ED05 DW 1517
2536 7E29 B905 DW 1465
2537 7E2B 8905 DW 1417
2538 7E2D 5E05 DW 1374
2539 7E2F 3705 DW 1335
2540 7E31 1305 DW 1299
2541 7E33 F204 DW 1266
2542 7E35 D304 DW 1235
2543 7E37 B604 DW 1206
2544 7E39 9B04 DW 1179
2545 7E3B 8204 DW 1154
2546 7E3D 6B04 DW 1131
2547 7E3F 5504 DW 1109
2548 7E41 4004 DW 1088
2549 7E43 2C04 DW 1068
2550 7E45 1A04 DW 1050
2551 7E47 0804 DW 1032
2552 7E49 F703 DW 1015
2553 7E4B E703 DW 999
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 19-2
2554 7E4D D803 DW 984
2555 7E4F C803 DW 968
2556 7E51 BB03 DW 955
2557 7E53 AE03 DW 942
2558 7E55 A103 DW 929
2559 7E57 9503 DW 917
2560 7E59 8903 DW 905
2561 7E5B 7D03 DW 893
2562 7E5D 7303 DW 883
2563 7E5F 6803 DW 872
2564 7E61 5E03 DW 862
2565 7E63 5403 DW 852
2566 7E65 4A03 DW 842
2567 7E67 4103 DW 833
2568 7E69 3803 DW 824
2569 7E6B 3003 DW 816
2570 7E6D 2703 DW 807
2571 7E6F 1F03 DW 799
2572 7E71 1703 DW 791
2573 7E73 0F03 DW 783
2574 7E75 0803 DW 776
2575 7E77 0103 DW 769
2576 7E79 FA02 DW 762
2577 7E7B F302 DW 755
2578 7E7D EC02 DW 748
2579 7E7F E602 DW 742
2580 7E81 E002 DW 736
2581 7E83 D902 DW 729
2582 7E85 D302 DW 723
2583 7E87 CE02 DW 718
2584 7E89 C802 DW 712
2585 7E8B C202 DW 706
2586 7E8D BD02 DW 701
2587 7E8F B702 DW 695
2588 7E91 B202 DW 690
2589 7E93 AD02 DW 685
2590 7E95 A802 DW 680
2591 7E97 A302 DW 675
2592 7E99 9F02 DW 671
2593 7E9B 9A02 DW 666
2594 7E9D 9502 DW 661
2595 7E9F 9102 DW 657
2596 7EA1 8C02 DW 652
2597 7EA3 8802 DW 648
2598 7EA5 8402 DW 644
2599 7EA7 8002 DW 640
2600 7EA9 7C02 DW 636
2601 7EAB 7802 DW 632
2602 7EAD 7402 DW 628
2603 7EAF 7002 DW 624
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 19-3
2604 7EB1 6C02 DW 620
2605 7EB3 6902 DW 617
2606 7EB5 6502 DW 613
2607 7EB7 6202 DW 610
2608
7EB9 09204142
7EBD 4F525445
2609 7EC1 442E ABORT: DB 9,' ABORTED.'; message displayed when aborting.
2610
2611 7EC3 INITB: ; The following are initial values of AlphaTEX variables (cf. INITV).
2612 7EC3 00 DB 0; Sum of bytes not yet acknowledged (mod 256).
2613 7EC4 00 DB 0; Keyboard input buffer when on-line.
2614 7EC5 00 DB 0; Number of lines ready in LB for typesetting.
2615 7EC6 0080 DW DQ; Place to write next byte in DQ.
2616 7EC8 0080 DW DQ; Place of first unacknowledged byte in DQ.
2617 7ECA 0080 DW DQ; Place to read next byte in DQ.
2618 7ECC 00 DB 0; Overrun flag (if bit 4 set).
2619 7ECD 00 DB 0; QFLAG, acknowledge bits, 00001111 => send ABORT.
2620 7ECE 00 DB 0; MFLAG, previous byte, calls protocol if = MAGIC.
2621 7ECF 5505 DW 1365; Current horizontal multiplier (initially 2/3).
2622 7ED1 FF DB 2047 AND 0FFH; Current vertical multiplier (initially 1), lsb.
2623 7ED2 95 DB (261-368) AND 0FFH; Current vertical shift, lsb.
2624 7ED3 77 DB 01110111B; Most significant bits of vertical multiplier, shift.
2625 7ED4 10 MSLSI: DB 00010000B; `Machine status latch' save.
2626 7ED5 F6 BTLSI: DB 11110110B; `Boot latch' save.
2627 7ED6 00 DB 0; If nonzero, must wait before starting new line.
2628 7ED7 00 DB 0; If nonzero, means line in progress.
2629 7ED8 18BC DW LB; Normal beginning of line buffer.
2630 7EDA INITE: ; End of initialization table.
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 20
2631 ; Program variables:
2632
2633 ; The ORG instruction governing location ABRT on page 7 must be adjusted so
2634 ; that there is no memory conflict here (and so that space isn't wasted).
2635 7F0B ORG 7FC2H-49*2-85
2636 7F0B INITV: ; Variables that must be initialized when restarting AlphaTEX:
2637 7F0B 00 SUMCH: DB 0; Sum of bytes not yet acknowledged (mod 256).
2638 7F0C 00 KBIB1: DB 0; Keyboard input buffer when on-line.
2639 7F0D 00 READY: DB 0; Number of lines ready in LB for typesetting.
2640 7F0E 0080 DQIN: DW DQ; Place to write next byte in DQ.
2641 7F10 0080 DQACK: DW DQ; Place of first unacknowledged byte in DQ.
2642 7F12 0080 DQOUT: DW DQ; Place to read next byte in DQ.
2643 7F14 00 OVFLG: DB 0; Overrun flag (if bit 4 set).
2644 7F15 00 QFLAG: DB 0; Acknowledge message bits...00001111 => ABORT.
2645 7F16 00 MFLAG: DB 0; Contains last byte. Flags protocol if = MAGIC.
2646 7F17 5505 AMULT: DW 1365; Current horizontal multiplier (initially 2/3).
2647 7F19 FF BMULT: DB 2047 AND 0FFH; Current vertical multiplier (initially 1), lsb.
2648 7F1A 95 YSHFT: DB (261-368) AND 0FFH; Current vertical shift, lsb.
2649 7F1B 77 YSBM: DB 01110111B; Most significant bits of vertical shift & multiplier.
2650 7F1C 10 MSLS: DB 00010000B; `Machine status latch' save.
2651 7F1D F6 BTLS: DB 11110110B; `Boot latch' save.
2652 7F1E 00 FFLAG: DB 0; If nonzero, must wait before starting new line.
2653 7F1F 00 LIP: DB 0; If nonzero, means line in progress.
2654 7F20 18BC LB0: DW LB; Beginning of line buffer. (Can be changed for special jobs.)
2655
2656 ; Variables that don't need to be initialized:
2657 7F22 00 SFLAG: DB 0; Inside SETUP subroutine, indicates whether DMA is needed.
2658 7F23 0000 LNGTH: DW 0; Length of first DMA on next scan done interrupt.
2659 7F25 0000 YBASE: DW 0; Current baseline.
2660 7F27 0000 LBIN: DW 0; Current line buffer position for storing data.
2661 7F29 0000 LBOUT: DW 0; Current line buffer position for reading data.
2662 7F2B 0000 RLI: DW 0; Accumulated starting cogs in RL state.
2663 7F2D 0000 RLJ: DW 0; Accumulated ending cogs in RL state.
2664 7F2F 0081 CHARI: DW CHAR1; CHAR1 or CHAR2, entering character.
2665 7F31 0081 CHARJ: DW CHAR1; CHAR1 or CHAR2, exiting character.
2666
2667 7F33 0000 CORR: DW 0; Clock cycles of extra lens motion for next line.
2668 7F35 0000 HCOG: DW 0; Hardware starting cog for next line.
2669
2670 7F37 0000 RLCOR: DW 0; Clock cycles of extra lens motion before RL line.
2671 7F39 0000 RLYB: DW 0; Feed motor position of baseline for RL line.
2672 7F3B 0000 RLHSC: DW 0; Hardware starting cog before RL line.
2673 7F3D 0000 RLRST: DW 0; Lens motor rest position before RL line.
2674 7F3F 0000 RLSTP: DW 0; Starting position in LB for RL line, less 5.
2675
2676 7F41 0000 LRCOR: DW 0; Clock cycles of extra lens motion before LR line.
2677 7F43 0000 LRYB: DW 0; Feed motor position of baseline for LR line.
2678 7F45 0000 LRHSC: DW 0; Hardware starting cog before LR line.
2679 7F47 0000 LRRST: DW 0; Lens motor rest position before LR line.
2680 7F49 0000 LRSTP: DW 0; Stopping position in LB for LR line.
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 20-2
2681
2682 7F4B C076 YHOME: DW 30400; Initial feed motor position, in 5/8 mil units from top.
2683 7F4D 0000 YWANT: DW 0; Desired feed motor position, in 5/8 mil units from top.
2684 7F4F C076 FMP: DW 30400; Current feed motor position, in 5/8 mil units from top.
2685 7F51 0000 LMP: DW 0; Current lens motor position, in motor steps from left.
2686
2687 7F53 00 LTYPE: DB 0; Type of lens interrupt.
2688 7F54 00 FTYPE: DB 0; Type of feed interrupt.
2689 7F55 00 GTYPE: DB 0; Type of timer interrupt.
2690
2691 7F56 00 LLIM: DB 0; Least significant byte of top speed lens motor rate entry.
2692 7F57 00 LSTAT: DB 0; Lens motor state.
2693 7F58 0000 LRATE: DW 0; Pointer to current rate table entry for lens motor.
2694 7F5A 0000 LSTEP: DW 0; Number of lens motor steps to be taken at top speed (≥2).
2695
2696 7F5C 00 FLIM: DB 0; Least significant byte of top speed feed motor rate entry.
2697 7F5D 00 FSTAT: DB 0; Feed motor state.
2698 7F5E 0000 FRATE: DW 0; Pointer to current rate table entry for feed motor.
2699 7F60 0000 FSTP1: DW 0; Feed steps at top speed before FFLAG cleared (≥2).
2700 7F62 00 FSTP2: DB 0; Feed steps at top speed after FFLAG cleared (0 or 26).
2701
2702 0062 STACK: DS 49*2;
2703 ; Calculation of maximum stack requirement:
2704 ; If all six kinds of interrupt are being serviced simultaneously, they fill
2705 ; 7 (LMIS) + 3 (SDIS) + 7 (FMIS) + 3 (GPTIS) + 3 (KBIS) + 4 (RDIS) = 27 positions
2706 ; on the stack. Actually they can't all be active simultaneously (e.g., scan-done
2707 ; will never happen at the same time as feed-motor), but to be safe let's assume
2708 ; 27. On top of this --- actually underneath, as it turns out --- is stack space
2709 ; for a low-priority routine that finishes some interrupt handling, up to 9
2710 ; positions more (namely a return address, four register pairs, and four more
2711 ; to take care of CALL SETUP). Add 6 since a low-priority lens routine can
2712 ; coexist over a low-priority scan-done routine. And underneath all this
2713 ; we have up to 7 more positions required (the worst case being PUSH, CALL LREST,
2714 ; which does two PUSHes and CALLs MULTD, which does two more PUSHes).
2715 ; Total 27+9+6+7=49 is more than sufficient stack space.
2716
2717 ; The following data addresses are required by the boot PROM code.
2718 ; (A few locations that are available during on-line mode are also double-used.)
2719 7FC2 ORG 7FC2H
2720 7FC2 ISPV: ; initial stack pointer value
2721 7FC2 00 LMBSY: DB 0; lens motor busy
2722 7FC3 00 FMBSY: DB 0; feed motor busy
2723 7FC4 00 KBLC: DB 0; keyboard load counter
2724 7FC5 00 BTS3: DB 0; bootstrap temp storage
2725 7FC6 TEMP:
7FC6 00000000
2726 7FCA 00 BTS4: DB 0,0,0,0,0; (used by NFE routine)
2727 7FCB 000000 KBIB: DB 0,0,0; keyboard input buffer (5 bytes, used by KBIS routine)
2728 7FCE 0000 YB: DW 0; Feed motor position of baseline for first line on page.
2729
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 20-3
2730 ; Further variables that don't need to be initialized.
2731
2732 7FD0 0000 COG: DW 0; Current software cog counter (increases by one on each
2733 ; scan done, even when setting right to left).
2734 7FD2 0000 COGI: DW 0; Software cog where next character is to enter.
2735 7FD4 0000 COGJ: DW 0; Software cog where next character is to exit.
2736 7FD6 0000 COGID: DW 0; Next increment for COGI.
2737 7FD8 0000 COGJD: DW 0; Next increment for COGJ.
2738 7FDA 0000 INSTB: DW 0; Line buffer pointer for beginning of line.
2739 7FDC 0000 INSTE: DW 0; Line buffer pointer for end of line.
2740 7FDE 0000 INSTI: DW 0; Line buffer pointer for entering character.
2741 7FE0 0000 INSTJ: DW 0; Line buffer pointer for exiting character.
2742 7FE2 00 STATE: DB 0; 10101010 means LR, 01010101 means RL.
2743 7FE3 00 OUTST: DB 0; 10101010 if setting left to right, 01010101 if right to left.
2744
2745 ; The following data addresses are required by the disk server.
2746 7FE4 ORG 7FE4H
2747 000A DS 10; disk server stack area
2748 7FEE 00 VARSE: DB 0; variable sector format select
2749 0009 DS 9; disk control and status area
2750 7FF8 00 OKWD: DB 0; result byte, set to 8 when initiating action
2751 7FF9 00 COMWD: DB 0; disk operation code
2752 7FFA 00 DISK: DB 0; disk number
2753 7FFB 00 TRACK: DB 0; track number
2754 7FFC 00 SECTR: DB 0; sector number
2755 7FFD 0000 ADDR: DW 0; RAM address
2756 7FFF 00 NSCT: DB 0; number of sectors (0 means 256)
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 21
2757 ; The second memory board (locations 8000H and higher):
2758
2759 8000 ORG 8000H
2760 0100 DQ: DS 256; Cyclic buffer for RS232 data input.
2761 ; It is important that DQ and CHAR1 be locations of the form ..00H.
2762
2763 8100 09 CHAR1: DB CHAR2 AND 0FFH; used to swap to other character.
2764 8101 00 C1NB7: DB 0; character 1 new byte 7.
2765 8102 0000 C1B7A: DW 0; character 1 address of byte 7.
2766 8104 00 C1NBA: DB 0; character 1 new byte 10.
2767 8105 0000 C1DC: DW 0; character 1 DMA count (boundary bytes + 1).
2768 8107 0000 C1DI: DW 0; character 1 DMA info (address of byte 1).
2769
2770 8109 00 CHAR2: DB CHAR1 AND 0FFH; used to swap to other character.
2771 810A 00 C2NB7: DB 0; character 2 new byte 7.
2772 810B 0000 C2B7A: DW 0; character 2 address of byte 7.
2773 810D 00 C2NBA: DB 0; character 2 new byte 10.
2774 810E 0000 C2DC: DW 0; character 2 DMA count (boundary bytes + 1).
2775 8110 0000 C2DI: DW 0; character 2 DMA info (address of byte 1).
2776
2777 8112 07 BLANK: DB 00000111B; "new byte 7" for a blank character.
2778 8113 037E DW BLNK+6; address of byte 7.
2779 8115 FF DB 11111111B; "new byte 10".
2780 8116 1000 DW 16; boundary bytes + 1.
2781 8118 FD7D DW BLNK; address of byte 1.
2782
2783 03F4 CTB: DS 253*4; Character table for known characters.
2784 ; CTB entries are length (2 bytes) followed by address (2 bytes).
2785
2786 850E REP2: ; Second repertoire area.
2787
2788 BC18 ORG 0C000H-200*5; (assuming a line buffer of size 200)
2789 BC18 LB: ; Double buffer for line output.
2790 ; The line buffer stores 5-word entries, either Adjust-cog instructions or
2791 ; modified Typeset instructions. Information for LR lines appears at the
2792 ; bottom of the buffer, RL lines at the top.
2793 C000 LBEND EQU 0C000H
2794
2795 ; The following program loads "HEX" files assembled by the "MICROS" assembler.
2796 ; Since it won't assemble things into locations ≥ 0BE00H, any errors in
2797 ; the loader itself have to be patched by hand.
2798
2799 BF00 ORG 0BF00H
2800 BF00 LOADR:
2801 BF00 CDAABF NEWLN: CALL GETC; Wait for a colon or dollar sign.
2802 BF03 FE24 CPI '$'
2803 BF05 CA2040 JZ START; A dollar sign means we are done.
2804 BF08 FE3A CPI ':'
2805 BF0A C200BF JNZ NEWLN; Skip everything before a colon.
2806
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 21-2
2807 BF0D 0600 MVI B,0; Clear the check sum.
2808 BF0F CD8EBF CALL GETH; Read the number of data bytes.
2809 BF12 B7 ORA A
2810 BF13 CA00BF JZ NEWLN; Ignore whole line, if there aren't any.
2811 BF16 4F MOV C,A; Otherwise save the number of bytes in C.
2812
2813 BF17 CD8EBF CALL GETH; Read the address.
2814 BF1A FEBE CPI 0BEH
2815 BF1C D200BF JNC NEWLN; Don't load into locations 0BE00H and higher.
2816 BF1F 67 MOV H,A
2817 BF20 CD8EBF CALL GETH
2818 BF23 6F MOV L,A; HL ← current load address.
2819
2820 BF24 CD8EBF CALL GETH; Read the dummy byte.
2821 BF27 B7 ORA A
2822 BF28 C23ABF JNZ BADCH; It should be zero.
2823
2824 BF2B CD8EBF NXTBY: CALL GETH; Read a data byte.
2825 BF2E 77 MOV M,A; Load it into proper place.
2826 BF2F 23 INX H
2827 BF30 0D DCR C
2828 BF31 C22BBF JNZ NXTBY; Repeat until rC=0.
2829
2830 BF34 CD8EBF CHECK: CALL GETH; Read the sum check byte.
2831 BF37 CA00BF JZ NEWLN; Jump if it's zero (i.e., satisfactory).
2832
2833 BF3A 1155BF BADCH: LXI D,DM13; Display ' SUM CHECK FAILED!'
2834 BF3D CD1502 CALL DCS
2835 BF40 0E1E MVI C,30; Delay about 30 seconds, ignoring the rest of the file.
2836 BF42 21204E BADC1: LXI H,20000
2837 BF45 CDF27D CALL DELAY
2838 BF48 0D DCR C
2839 BF49 C242BF JNZ BADC1
2840
2841 BF4C 1168BF LXI D,DM12; Display 'TRY TO SEND THE WHOLE HEX FILE AGAIN:'
2842 BF4F CD1502 CALL DCS
2843 BF52 C300BF JMP LOADR
2844
BF55 12205355
BF59 4D204348
BF5D 45434B20
BF61 4641494C
2845 BF65 454421 DM13: DB 18,' SUM CHECK FAILED!'
BF68 25545259
BF6C 20544F20
BF70 53454E44
BF74 20544845
BF78 2057484F
BF7C 4C452048
BF80 45582046
MICRO-SYMBOL 7-JULY-1980 ALPHA PAGE 21-3
BF84 494C4520
BF88 41474149
2846 BF8C 4E3A DM12: DB 37,'TRY TO SEND THE WHOLE HEX FILE AGAIN:'
2847
2848 ; The following subroutine reads a byte of hex, updates the check sum,
2849 ; and returns with condition zero if the check sum is zero.
2850 BF8E CD9FBF GETH: CALL GETD
2851 BF91 87 ADD A; Left shift four.
2852 BF92 87 ADD A
2853 BF93 87 ADD A
2854 BF94 87 ADD A
2855 BF95 5F MOV E,A
2856 BF96 CD9FBF CALL GETD
2857 BF99 83 ADD E
2858 BF9A 5F MOV E,A
2859 BF9B 80 ADD B
2860 BF9C 47 MOV B,A; Accumulate check sum.
2861 BF9D 7B MOV A,E
2862 BF9E C9 RET
2863
2864 BF9F CDAABF GETD: CALL GETC; Subroutine to read a hex digit:
2865 BFA2 D630 SUI '0'
2866 BFA4 FE0A CPI 10
2867 BFA6 D8 RC ; Return, it was a digit.
2868 BFA7 D607 SUI 'A'-'0'-10
2869 BFA9 C9 RET ; Assume that it was between A and F.
2870
2871 BFAA DB81 GETC: IN RS232+1; Subroutine to read an ASCII character:
2872 BFAC 1F RAR
2873 BFAD 1F RAR
2874 BFAE D2AABF JNC GETC; Wait until character has been received.
2875
2876 BFB1 DB80 IN RS232
2877 BFB3 F5 PUSH PSW
2878 BFB4 E5 PUSH H
2879 BFB5 D5 PUSH D
2880 BFB6 CD2302 CALL DC; Echo it on the CRS display.
2881 BFB9 D1 POP D
2882 BFBA E1 POP H
2883 BFBB F1 POP PSW
2884 BFBC C9 RET
2885
2886 BFBD 00 XSUM: DB 0
2887
END
No errors detected.
Program break is BFBE
MICRO-SYMBOL 7-JULY-1980 SYMBOL TABLE PAGE 1
ABORT 7EB9 CHARJ 7F31 DSKARG 43F0 GETC BFAA
ABRT 73A0 CHB 412D DSKCOM 40E7 GETD BF9F
ABRT1 73A2 CHB1 785E DSKGO 40F5 GETH BF8E
ADDR 7FFD CHBOL 783D DSKWT 40FA GPTI1 79DE
ADJC 765A CHECK BF34 DUMP 40C9 GPTI2 79E4
AMULT 7F17 CHK32K 43E8 DUMP3 40C0 GPTI3 79ED
AQUIT 770F CMPD 7D92 DUMP4 40C3 GPTIS 79C4
BAD 76A8 CMULT 7624 EIS 01B9 GTIMR 00CA
BADC1 BF42 COG 7FD0 EOF 73C9 GTYPE 7F55
BADCH BF3A COGI 7FD2 EOL 7A7D HCOG 7F35
BEAMR 0098 COGID 7FD6 EOL1 7AB2 INIT1 40A5
BLANK 8112 COGJ 7FD4 EOL2 7AD1 INIT3 40C0
BLNK 7DFD COGJD 7FD8 ERROR 010D INITB 7EC3
BMULT 7F19 COLL 00DE FCY1A 7954 INITD 4096
BOL 7B2A COMWD 7FF9 FCY2A 7931 INITE 7EDA
BOL1 7B4F CORR 7F33 FCY2B 7939 INITV 7F0B
BOL2 7B5C CTB 811A FCYC 78F0 INSTB 7FDA
BP1 7A0E DC 0223 FCYC1 793D INSTE 7FDC
BP2 7A1C DCS 0215 FCYC2 7927 INSTI 7FDE
BP3 7A3A DEB0 4426 FCYC3 7905 INSTJ 7FE0
BPAGE 7A06 DEB1 445D FCYC4 7920 INT 00C0
BRIT1 7597 DEB2 444E FCYC6 7964 INTCL 6024
BRIT2 75C7 DEB3 4432 FCYC7 7974 INTSP 6022
BRIT3 75E2 DEBUG 4430 FCYC8 797C INTSV 6020
BRIT4 75F8 DELAY 7DF2 FCYC9 7998 INTTP 6021
BRITE 758F DELAY2 7DEF FCYCS 790B ISPV 7FC2
BRT1 0088 DISK 7FFA FEED 7612 ISW 7763
BRT2 00A0 DISP1 74DA FFLAG 7F1E ISW0 7766
BSTEP 00DF DISPL 00DD FGO 787D KBIB 7FCB
BTAD 024F DISPM 74D9 FGO1 7894 KBIB1 7F0C
BTLCH 00DA DM1 42E9 FGO2 7897 KBIS 0173
BTLS 7F1D DM10 43AE FGO3 78BB KBIS1 7734
BTLSI 7ED5 DM11 43C8 FGO3A 78CE KBIS2 774D
BTS3 7FC5 DM12 BF68 FGO4 7878 KBLC 7FC4
BTS4 7FC6 DM13 BF55 FL1 4279 LB BC18
C1B7A 8102 DM14 43CE FL2 428A LB0 7F20
C1DC 8105 DM2 4303 FL3 4290 LBEND C000
C1DI 8107 DM3 4329 FLASH 4272 LBIN 7F27
C1NB7 8101 DM4 4339 FLIM 7F5C LBOUT 7F29
C1NBA 8104 DM5 4350 FMBSY 7FC3 LCYC 77C4
C2B7A 810B DM6 436C FMIS 786E LCYC1 781E
C2DC 810E DM7 438A FMP 7F4F LCYC2 77FB
C2DI 8110 DM8 4393 FRATE 7F5E LCYC3 77D9
C2NB7 810A DM9 4399 FSTAT 7F5D LCYC4 77F4
C2NBA 810D DMA 00D2 FSTP1 7F60 LCYC5 7818
CAC 014C DNWRD 4268 FSTP2 7F62 LCYC7 7831
CDTAC 0152 DQ 8000 FTIMR 00D0 LCYCS 77DF
CHAR1 8100 DQACK 7F10 FTYPE 7F54 LGO 776B
CHAR2 8109 DQIN 7F0E GET 7400 LGO0 7769
CHARI 7F2F DQOUT 7F12 GET0 742D LGO1 7786
MICRO-SYMBOL 7-JULY-1980 SYMBOL TABLE PAGE 2
LGO2 7788 ONLIN 42A9 SDIS2 7BD2 TABLE 7E0F
LGO3 779F ONWRD 4264 SECTR 7FFC TEMP 7FC6
LIP 7F1F OUTST 7FE3 SENDB 44AE TRAC1 440B
LLIM 7F56 OVFLG 7F14 SENDC 44C6 TRAC2 43F6
LMBSY 7FC2 OVRUN 76A6 SERCH 4155 TRAC3 4423
LMIS 7751 POP1L 7BE2 SET1 7BED TRACE 43F4
LMP 7F51 POP2 775A SET1A 7C03 TRACK 7FFB
LNGTH 7F23 POP2L 7BE1 SET1B 7C06 TRACL 43F0
LOAD 4104 POP3 7759 SET1C 7C2D TYP1 743B
LOADR BF00 POP3L 7BE0 SET1D 7C33 TYP2 7496
LR1 7B15 POP4 7758 SET1E 7C48 TYP3 747F
LRATE 7F58 POP4L 7BDF SET1F 7C49 TYP4 74B7
LRCOR 7F41 PRMPT 402C SET2 7C50 TYPST 743A
LREST 7ADF PRTCL 76B1 SET3 7C68 UNTR 4463
LRHSC 7F45 QFLAG 7F15 SET3A 7CC5 UNTR1 4474
LRRST 7F47 QOK 7424 SET3B 7CCF UNTR2 449D
LRSTP 7F49 QUIT 406B SET3C 7CF6 UNTR3 4495
LRYB 7F43 RATE 00B8 SET3D 7CFC UNTR4 44A5
LSTAT 7F57 RDATA 768D SET3E 7D11 UNTR5 44A8
LSTEP 7F5A RDIS 7679 SET3F 7D12 UNTRL 43F2
LTIMR 00C8 RDIS4 76D9 SET4 7D19 VARSE 7FEE
LTYPE 7F53 RDIS6 7704 SET6 7D39 WAIT 4032
MAGIC 0069 RDKC 4134 SET7 7D62 WAIT1 4037
MFLAG 7F16 RDKC1 4138 SET8 7D6D WRT32K 43E0
MM1 4208 RDKC2 413C SETADR 0005 XNEGD 7D9F
MM2 4230 READ 74BA SETCOM 0001 XSUM BFBD
MM3 426C READ1 754D SETDSK 0002 YB 7FCE
MODFY 41EF READ2 74E7 SETNSC 0007 YBASE 7F25
MOVBL 7DD5 READ3 758B SETSCT 0004 YHOME 7F4B
MOVE 7DDC READY 7F0D SETTRK 0003 YSBM 7F1B
MOVE1 7DE2 REP1 4020 SETUP 7BE4 YSHFT 7F1A
MSLCH 00DB REP2 850E SETVAR 0000 YWANT 7F4D
MSLS 7F1C RESET 73A9 SFLAG 7F22 ZORO 76C5
MSLSI 7ED4 REST0 4460 SHUF1 7575
MULT1 7DAC REST1 73AB SHUFF 755B
MULT2 7DB1 REST2 73B5 SLOC 41ED
MULT3 7DB9 RLCOR 7F37 SLOOK 41EB
MULT4 7DCC RLHSC 7F3B SMD 01FE
MULTD 7DA8 RLI 7F2B SRCH1 417B
NCL1 79BD RLJ 7F2D SRCH2 417C
NCLMP 79A8 RLRST 7F3D SRCH3 4194
NEGD 7DA0 RLSTP 7F3F SRCH4 41C7
NEW1 7513 RLYB 7F39 SRCH9 41E4
NEWCH 74EA RPLCH 00DF STACK 7F63
NEWDSK 43D8 RPORT 7717 START 4020
NEWLN BF00 RPRT0 7725 STATE 7FE2
NFE 0110 RPRT1 772F SUBD 7D98
NSCT 7FFF RS232 0080 SUMCH 7F0B
NXTBY BF2B SDIS 7B8A SWICH 403B
OKWD 7FF8 SDIS1 7BC7 SWT 404B
ABORT 697 2609#
ABRT 696# 764
ABRT1 595 697#
ADDR 2755#
ADJC 905 1178# 1180
AMULT 973 976 1149 2646#
AQUIT 1246 1302#
BAD 1234# 1250
BADC1 2836# 2839
BADCH 2822 2833#
BEAMR 38# 1075
BLANK 2478 2777#
BLNK 2506# 2778 2781
BMULT 980 1157 2647#
BOL 1530 1542 1985#
BOL1 1995 2007#
BOL2 2005 2015#
BP1 1818# 1823
BP2 1825# 1835
BP3 1828 1831 1842#
BPAGE 901 1813#
BRIT1 1050# 1055
BRIT2 1083# 1087 1104
BRIT3 1096 1103#
BRIT4 1114 1116# 1118 1120
BRITE 1045#
BRT1 36# 1090 1127 1130
BRT2 37# 1091
BSTEP 39# 1083 1116
BTAD 47#
BTLCH 34# 130 468 580 1080 1391 1583 1789 2370
BTLS 128 577 579 1076 1381 1573 1785 2366 2651#
BTLSI 467 2626#
BTS3 2724#
BTS4 2726#
C1B7A 2343 2765#
C1DC 2351 2767#
C1DI 2069 2768#
C1NB7 2342 2764#
C1NBA 2348 2766#
C2B7A 2077 2772#
C2DC 2085 2774#
C2DI 2091 2775#
C2NB7 2076 2771#
C2NBA 2082 2773#
CAC 48# 297 299 306 308 366 368
CDTAC 49# 246 655 658
CHAR1 2038 2664 2665 2763# 2770
CHAR2 2283 2763 2770#
CHARI 2024 2249 2251 2664#
CHARJ 2025 2136 2138 2665#
CHB 224# 263 267 344 347 393
CHB1 1532 1536#
CHBOL 1510# 1701 1930
CHECK 2830#
CHK32K 178 493#
CMPD 725 1375 1403 1571 1587 1601 1610 1678 2129 2146
2198 2208 2218 2291 2396 2418#
CMULT 894 1144#
COG 2125 2194 2732#
COGI 2033 2207 2285 2305 2311 2333 2734#
COGID 1917 2324 2328 2736#
COGJ 2035 2128 2160 2166 2188 2735#
COGJD 1921 2179 2183 2737#
COLL 41# 2099
COMWD 191 2751#
CORR 1480 1482 1860 2393 2667#
CTB 803 921 1004 2229 2783#
DC 50# 247 741 909 2880
DCS 51# 90 310 370 698 2834 2842
DEB0 577#
DEB1 587 589 603#
DEB2 597# 603
DEB3 567 585#
DEBUG 582#
DELAY 440 666 702 2497# 2500 2502 2837
DELAY2 1424 1806 2496#
DISK 2752#
DISP1 908# 911
DISPL 33# 432 1326
DISPM 907#
DM1 477# 608
DM10 206 486#
DM11 292 309 487#
DM12 2841 2846#
DM13 2833 2845#
DM14 470 488#
DM2 89 478#
DM3 147 479#
DM4 167 480#
DM5 171 481#
DM6 182 482#
DM7 257 338 483#
DM8 360 369 484#
DM9 405 485#
DMA 40# 2066 2068 2071 2073 2074 2087 2089 2093 2095
2097
DNWRD 386 402#
DQ 2615 2616 2617 2640 2641 2642 2760#
DQACK 781 1293 1298 2641#
DQIN 766 1216 1230 1288 2640#
DQOUT 749 787 1226 2642#
DSKARG 495# 503
DSKCOM 151 175 179 187#
DSKGO 158 194#
DSKWT 197# 199
DUMP 120 171#
DUMP3 167# 176
DUMP4 168# 183 406
EIS 52#
EOF 715# 720 1041
EOL 914 1877#
EOL1 1896 1909#
EOL2 1907 1925#
ERROR 53# 64 78 673 675 677 679 681 685 687
FCY1A 1696 1703#
FCY2A 1679 1682#
FCY2B 1685# 1710
FCYC 1553 1632 1640#
FCYC1 1642 1688#
FCYC2 1650 1677#
FCYC3 1653# 1721
FCYC4 1666 1671#
FCYC6 1689 1705 1712#
FCYC7 1715 1723#
FCYC8 1728#
FCYC9 1734 1744#
FCYCS 1657# 1686
FEED 998 1134#
FFLAG 1516 1699 1736 1759 1808 2652#
FGO 1567# 1809
FGO1 1576 1580#
FGO2 1579 1582#
FGO3 1602 1605#
FGO3A 1611 1617#
FGO4 1564# 1589
FL1 413# 443
FL2 416 424#
FL3 420 422 426 429#
FLASH 124 408#
FLIM 1629 1645 2696#
FMBSY 716 1053 1631 1635 1664 1730 1758 1792 1819 2722#
FMIS 71 1549#
FMP 722 1570 1591 2391 2684#
FRATE 1625 1644 1653 1713 2698#
FSTAT 1640 1684 1692 2697#
FSTP1 1619 1682 2699#
FSTP2 1617 1703 2700#
FTIMR 31# 1658 1660 1662 1669 1672 1674 1724 1726
FTYPE 1567 1694 1728 2688#
GET 749# 783 822 824 827 829 889 896 903 908
925 927 930 932 952 995 1008 1010 1045 1047
1134 1136 1144 1146 1151 1153 1182 1184 1813 1815
1848 1850 1877 1879
GET0 752 757 769 781#
GETC 2801 2864 2871# 2874
GETD 2850 2856 2864#
GETH 2808 2813 2817 2820 2824 2830 2850#
GPTI1 1780 1792#
GPTI2 1742 1783 1795#
GPTI3 1795 1799#
GPTIS 73 1775#
GTIMR 30# 1481 1483 1768 1770
GTYPE 1479 1751 1757 1778 2689#
HCOG 1862 1988 2390 2668#
INIT1 154# 163
INIT3 152 159 166#
INITB 604 706 708 2611#
INITD 118 147#
INITE 604 706 2630#
INITV 707 2636#
INSTB 2016 2215 2738#
INSTE 2021 2143 2288 2739#
INSTI 2017 2217 2290 2303 2740#
INSTJ 2018 2145 2158 2741#
INT 32# 83 85 87 126 210 446 448 450 452
539 544 560 710 713 1355 1357
INTCL 137 693#
INTSP 144 692#
INTSV 127 690#
INTTP 691#
ISPV 469 2720#
ISW 1359# 1533 1538 1796 1801 2104 2109
ISW0 1359 1364# 1537 1800 2108
KBIB 97 242 262 266 318 343 346 380 392 396
2727#
KBIB1 732 1328 1833 2638#
KBIS 54# 684
KBIS1 75 1323#
KBIS2 1330 1334 1340#
KBLC 92 233 235 313 314 374 409 434 611 620
2723#
LB 2629 2654 2789#
LB0 1872 1923 2012 2654#
LBEND 1906 2003 2793#
LBIN 796 851 885 1188 1873 1895 1925 2660#
LBOUT 1874 2661#
LCYC 1348 1425 1433#
LCYC1 1435 1489#
LCYC2 1444 1470#
LCYC3 1447# 1499
LCYC4 1460 1464#
LCYC5 1476 1485#
LCYC7 1493 1501#
LCYCS 1451# 1472
LGO 1372# 2028
LGO0 730 1371# 1870
LGO1 1383 1389#
LGO2 1387 1390#
LGO3 1404 1407#
LIP 2411 2653#
LLIM 1422 1437 2691#
LMBSY 718 1051 1428 1458 1507 1515 1821 2721#
LMIS 67 1344#
LMP 1106 1374 1379 2685#
LNGTH 2061 2354 2360 2658#
LOAD 123 203#
LOADR 203 222 2800# 2843
LR1 1957 1972#
LRATE 1419 1438 1447 1491 2693#
LRCOR 1859 1974 2380 2676#
LREST 1846 1890 1935#
LRHSC 1861 1981 2382 2678#
LRRST 1868 1976 1997 2679#
LRSTP 1898 2010 2680#
LRYB 1911 2378 2677#
LSTAT 1433 1486 1490 2361 2692#
LSTEP 1410 1470 2694#
LTIMR 29# 132 133 135 139 141 1452 1454 1456 1462
1465 1467 1502 1504
LTYPE 1372 1474 2687#
MAGIC 1201# 1208 1213 1242
MFLAG 1206 2645#
MM1 350# 382 400 403
MM2 374# 376
MM3 352 354 405#
MODFY 121 338# 384
MOVBL 2141 2284 2478#
MOVE 192 711 1037 2481#
MOVE1 2483 2486# 2491 2493
MSLCH 35# 466 738 1748 1766 1840 2205 2405
MSLS 734 1313 1744 1762 1825 2201 2401 2650#
MSLSI 465 2625#
MULT1 2448# 2466
MULT2 2450# 2456
MULT3 2452 2455#
MULT4 2458 2467#
MULTD 819 1059 1160 1948 1952 2445#
NCL1 1752 1768#
NCLMP 727 1757# 1866 2398
NEGD 1881 2436#
NEW1 949 952# 956 958
NEWCH 916#
NEWDSK 150 491#
NEWLN 2801# 2805 2810 2815 2831
NFE 55# 168
NSCT 155 2756#
NXTBY 2824# 2828
OKWD 195 197 2750#
ONLIN 115 445#
ONWRD 390 399#
OUTST 1844 1993 2173 2318 2372 2743#
OVFLG 1234 1260 2643#
OVRUN 1228 1233#
POP1L 1513 1520 2118#
POP2 1341 1352# 1790 1793 1797 2105
POP2L 2117#
POP3 1214 1231 1238 1271 1294 1300 1304 1320 1351#
POP3L 2116#
POP4 1350# 1554
POP4L 1543 1810 2115#
PRMPT 89# 109 110 111 112 113 114 116 117 164
169 180 205 332 388 398 648
PRTCL 1210 1240#
QFLAG 586 750 762 773 776 1268 1285 1303 1307 1337
1829 2644#
QOK 773#
QUIT 126#
RATE 44# 213 455
RDATA 1216# 1243
RDIS 77 1203#
RDIS4 1262 1265#
RDIS6 1289 1296#
RDKC 232# 260 341 373
RDKC1 235# 250
RDKC2 237# 238
READ 742 889# 912 992 1038 1131 1142 1176 1875 1932
READ1 891 994#
READ2 898 914#
READ3 997 1040#
READY 715 792 1023 1050 1178 1511 1818 1927 2407 2639#
REP1 80#
REP2 2786#
RESET 700#
REST0 597 599 604#
REST1 701# 704
REST2 474 588 590 598 600 706#
RLCOR 1962 2387 2670#
RLHSC 1969 2389 2672#
RLI 875 877 1903 1914 2662#
RLJ 878 880 1904 1918 2663#
RLRST 1964 2007 2673#
RLSTP 1909 2000 2674#
RLYB 1900 2385 2671#
RPLCH 42# 1986 1991 2015
RPORT 1253 1306#
RPRT0 1309 1313#
RPRT1 1310 1316 1319#
RS232 43# 215 217 219 221 457 459 461 463 668
696 754 774 1209 1273 1297 1319 2871 2876
SDIS 69 2050#
SDIS1 2064 2099#
SDIS2 2103 2107#
SECTR 157 2754#
SENDB 637 639 642 650#
SENDC 625 627 656 659 661 664#
SERCH 119 254#
SET1 2128# 2190
SET1A 2039 2141#
SET1B 2143# 2167
SET1C 2147 2169#
SET1D 2162 2172#
SET1E 2175 2186#
SET1F 2170 2188#
SET2 2130 2192#
SET3 2199 2207# 2336
SET3A 2219 2283#
SET3B 2281 2288# 2312
SET3C 2292 2314#
SET3D 2307 2317#
SET3E 2320 2331#
SET3F 2315 2333#
SET4 2209 2338#
SET6 2340 2360#
SET7 2376 2385#
SET8 2383 2390#
SETADR 501#
SETCOM 497#
SETDSK 498#
SETNSC 502#
SETSCT 500#
SETTRK 499#
SETUP 2113 2122#
SETVAR 496#
SFLAG 2123 2133 2212 2338 2657#
SHUF1 1023# 1025
SHUFF 1000#
SLOC 288 298 300 326 334#
SLOOK 290 322 325 333#
SMD 56# 148 172 207 258 339 471 609
SRCH1 272# 275 328
SRCH2 273# 278
SRCH3 283 288#
SRCH4 315# 316
SRCH9 286 320 330#
STACK 2702#
START 81# 145 601 2803
STATE 832 870 1843 1884 1955 2742#
SUBD 841 969 1162 1393 1408 1585 1606 1614 1937 1960
2426#
SUMCH 1220 1255 2637#
SWICH 97# 436
SWT 101 109#
TABLE 1418 1489 1624 1712 2523#
TEMP 2223 2246 2725#
TRAC1 551# 556
TRAC2 535# 594
TRAC3 568#
TRACE 533#
TRACK 161 2753#
TRACL 473 506# 548 558 592 612
TYP1 792# 794
TYP2 863# 1197
TYP3 834 840#
TYP4 872 885#
TYPST 791# 994
UNTR 122 608#
UNTR1 616# 644
UNTR2 618 641#
UNTR3 631 636#
UNTR4 634 646#
UNTR5 622 647#
UNTRL 507# 614 647
VARSE 188 2748#
WAIT 91#
WAIT1 94# 95
WRT32K 174 492#
XNEGD 1915 1919 2435#
XSUM 2886#
YB 1564 1738 1857 2728#
YBASE 1139 1141 1856 1893 2659#
YHOME 724 2682#
YSBM 984 2649#
YSHFT 990 1174 2648#
YWANT 1739 1760 1807 2683#
ZORO 1247 1252#